代码之家  ›  专栏  ›  技术社区  ›  Spark.Bao

如何在typescript中定义常量数组

  •  5
  • Spark.Bao  · 技术社区  · 6 年前

    const WEEKDAYS_SHORT: string[] = ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam']
    

    错误消息来自TypeScript(3.0)编译器:

    TS2322:类型“string[]”不能分配给类型“[string,string,string,string,string,string,string]”。 类型“string[]中缺少属性“0”。

    enter image description here

    string[] ReadonlyArray<string> ,则错误消息变为:

    TS2322:类型“ReadonlyArray”不能分配给类型“[string,string,string,string,string,string]”。 类型“ReadonlyArray”中缺少属性“0”。

    我的tsconfig.json:

    {
      "compilerOptions": {
        "declaration": false,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "lib": ["es6", "dom"],
        "module": "es6",
        "moduleResolution": "node",
        "sourceMap": true,
        "target": "es5",
        "jsx": "react",
        "strict": true
      },
      "exclude": [
        "**/*.spec.ts",
        "node_modules",
        "vendor",
        "public"
      ],
      "compileOnSave": false
    }
    

    如何在TypeScript中定义只读数组?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    6 年前

    正如您指出的,这个问题是因为您试图分配字符串数组( string[] )一个7字符串元组。而你的解决方案 any 会起作用的通常不建议使用 . 拼出柔顺的字也不太理想,因为它太长了。

    我们可以做的是创建一个helper函数来创建一个元组类型。此函数可用于任何需要元组的地方:

    function tupleArray<T extends any[]>(...v: T) {
        return v;
    }
    const WEEKDAYS_SHORT_INFFERED =  tupleArray('Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam')  // INFFERED AS [string, string, string, string, string, string, string]
    const WEEKDAYS_SHORT: [string, string, string, string, string, string, string] = WEEKDAYS_SHORT_INFFERED
    
        2
  •  5
  •   Mateja Petrovic    5 年前

    您可以添加 as const 你的声明;

    const readonlyArray = [1, 2, 3] as const;
    
    

    typeof readonlyArray[number] 会是 1 | 2 | 3

        3
  •  1
  •   Spark.Bao    6 年前

    调试后,我发现这不是TypeScript编译器的问题,这是因为我使用了第三方组件调用DayPicker:

              <DayPicker
                onDayClick={this.handleDayClick}
                selectedDays={posts.day}
                months={MONTHS}
                weekdaysShort={WEEKDAYS_SHORT}
                firstDayOfWeek={1}/>
    

    weekdaysShort 不是 string[] ,但是 [string, string, string, string, string, string, string]

    weekdaysShort?: [string, string, string, string, string, string, string];
    

    字符串[] 不匹配 [字符串,字符串,字符串,字符串,字符串,字符串,字符串] .

    最后,我把类型从 any 当然,为了避免这条异常错误消息,我们可以更改为 还有(太长)。

        4
  •  0
  •   Romain Deneau    6 年前

    TypeScript playground .

    但是,如果使用推断类型,不管它是什么(字符串数组 string[] 或7字符串元组 [string, string, string, string, string, string, string] )?

    const WEEKDAYS_SHORT = ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'];
    const sunday = 0;
    const dayShortName = WEEKDAYS_SHORT[sunday]; // => 'Dim'
    

    还是一个枚举?

    enum WEEKDAYS_SHORT { 'Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam' }
    const sunday = 0;
    const dayShortName = WEEKDAYS_SHORT[sunday]; // => 'Dim'
    

    any 在这种情况下。