我有以下代码:
enum A {
FOO = 0,
BAR = 1,
BAZ = 2
}
type B = {
[key in A]: number
}
declare let b: B;
Run Code Online (Sandbox Code Playgroud)
效果很好。我可以使用b[A.FOO]但不能b[123]。但是,我也希望能够使用b.length,但是当我向 type 添加属性时B,就像这样......
type B = {
length: number,
[key in A]: number
}
Run Code Online (Sandbox Code Playgroud)
...我收到以下错误
类型文字中的计算属性名称必须引用类型为文字类型或“唯一符号”type.ts(1170) 的表达式 计算属性名称必须为“string”、“number”、“symbol”或“any”类型。ts(2464)
我该如何解决这个问题?
您已发现表单的映射类型不允许{[K in XXX]: YYY}附加属性。幸运的是,您可以通过使用交集类型获得相同的效果;两种对象类型的交集具有两者的所有属性:
type B = {
[key in A]: number
} & { length: number };
Run Code Online (Sandbox Code Playgroud)
在您的特定情况下,由于所有这些属性都是 type number,您还可以使用单个映射类型,其中键类型是枚举值和文字类型的并集:A "length"
type B = {
[key in A | "length"]: number;
}
Run Code Online (Sandbox Code Playgroud)
两个版本都可以按照您的意愿工作:
let b: B = {
[A.FOO]: 12,
[A.BAR]: 34,
[A.BAZ]: 56,
length: 78
} // okay
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2295 次 |
| 最近记录: |