如何在打字稿中定义const数组

时间:2018-08-16 06:20:35

标签: arrays typescript

我的代码:

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'不能分配给类型'[字符串,字符串,字符串,字符串,字符串,字符串,字符串]'。     类型'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中定义一个只读数组?

4 个答案:

答案 0 :(得分:2)

您可以在声明中添加as const

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

此外,类型typeof readonlyArray[number]将是1 | 2 | 3

答案 1 :(得分:1)

调试后,我发现不是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];

因此TS编译显示string[][string, string, string, string, string, string, string]不匹配。

最后,我只是将类型从string[]更改为any,以避免出现此错误消息,当然,我们也可以更改为[string, string, string, string, string, string, string](太长)。

答案 2 :(得分:1)

正如您所指出的,问题是由原因造成的,因为您尝试将字符串数组(string[])分配给7字符串元组。尽管您使用any的解决方案可以工作,但通常不建议使用any。拼写出柔顺的声音也不理想,因为它太长了。

我们可以做的是创建一个帮助器函数来创建一个元组类型。此功能可在需要元组的任何地方重用:

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

答案 3 :(得分:0)

我没有在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'

IMO,在这种情况下,上述两个选项都比指定类型any更好。