TypeScript 在枚举中使用带引号的键强制元组的数组类型

dwbf0jvd  于 2022-10-29  发布在  TypeScript
关注(0)|答案(1)|浏览(162)

错误报告

对枚举使用带引号的键(例如,当枚举以数字开头时)会奇怪地破坏对象的键入。
我尝试将元组指定为对象值,但TS不允许:当使用带引号的枚举成员时,元组值类型被强制为数组。
请看操场,有一些变通办法,我发现这使我相信这是一个错误。
我发现这个问题有一个很好的解释,但从指定的变通办法来判断,它似乎不是这里的情况。
请注意,我的用例特别针对元组失败,但使用其他类型可以工作(在下面和操场上提供)

🔎检索词

计算的枚举键,枚举键,枚举

🕗版本和回归信息

4.5.4
在夜间(4.6.0)中的行为相同

Playground链接

Playground链接

💻代码

enum Keys {
  FIRST,
  SECOND
}

const obj: { // Shows correct type in a tooltip, evaluated to just what we need: { 0: [string, string], 1: [string, string] }
  [key in Keys]: [string, string] 
} = {
  [Keys.FIRST]: ['1', '2'], 
  [Keys['SECOND']]: ['3', '4'] // Error: Type of computed property's value is 'string[]', which is not assignable to type '[string, string]'.
}

// Using types other than tuples eliminates the problem
type Shape = { num: number } | { txt: string } | boolean

const fourth: {
  [key in Keys]: Shape
} = {
  [Keys.FIRST]: { num: 50 },
  [Keys['SECOND']]: { num: 100 },
  [Keys['SECOND']]: { txt: 'hey' }, // duplicate keys, but it doesn't matter for now
  [Keys['SECOND']]: true 
}

有趣的是,我发现在使用对象 * 作为常量 * 时也有同样的行为。

const keysStoredAsObject = {
  'FIRST': 0,
  'SECOND': 1
} as const
type ObjectKeys = keyof typeof keysStoredAsObject

const finalObj: {
  [key in typeof keysStoredAsObject[ObjectKeys]]: [string, string]
} = {
  [keysStoredAsObject.FIRST]: ['1', '2'], // All good
  [keysStoredAsObject['SECOND']]: ['3', '4'] // Error
}

🙁实际行为

不允许将元组作为值,引发string[][string, string]类型的不兼容错误

🙂预期行为

允许将元组指定为对象的值,而不是在其类型定义中指定的普通数组

相关问题