错误报告
对枚举使用带引号的键(例如,当枚举以数字开头时)会奇怪地破坏对象的键入。
我尝试将元组指定为对象值,但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]
类型的不兼容错误
🙂预期行为
允许将元组指定为对象的值,而不是在其类型定义中指定的普通数组
1条答案
按热度按时间aoyhnmkz1#
#29718的副本