Typescript 添加新属性时映射类型出现ts(1170)错误

Typescript 添加新属性时映射类型出现ts(1170)错误,typescript,Typescript,我有以下代码: enum A { FOO = 0, BAR = 1, BAZ = 2 } type B = { [key in A]: number } declare let b: B; 它很好用。我可以使用b[A.FOO],但不能使用b[123]。但是,我也希望能够使用b.length,但是当我向类型b添加属性时,就像这样 type B = { length: number, [key in A]: number } …我得到以下错误 A

我有以下代码:

enum A {
    FOO = 0,
    BAR = 1,
    BAZ = 2
}
type B = {
    [key in A]: number
}
declare let b: B;
它很好用。我可以使用
b[A.FOO]
,但不能使用
b[123]
。但是,我也希望能够使用
b.length
,但是当我向类型
b
添加属性时,就像这样

type B = {
    length: number,
    [key in A]: number
}
…我得到以下错误

A computed property name in a type literal must refer to an expression whose type is a literal type or a 'unique symbol' type.ts(1170) A computed property name must be of type 'string', 'number', 'symbol', or 'any'.ts(2464) 类型文字中的计算属性名称必须引用其类型为文字类型或“唯一符号”类型的表达式。ts(1170) 计算属性名称的类型必须为“字符串”、“数字”、“符号”或“任何”。ts(2464)
如何解决这个问题?

您已经发现
{[K in XXX]:YYY}
形式的a不允许附加属性。幸运的是,您可以通过使用;两种对象类型的交点具有以下两种对象类型的所有特性:

type B = {
    [key in A]: number
} & { length: number };
在您的特定情况下,由于所有这些属性的类型都是
number
,因此您也可以使用单个映射类型,其中键类型是
a
枚举值和
长度的类型:

这两个版本都可以按照您的要求工作:

let b: B = {
    [A.FOO]: 12,
    [A.BAR]: 34,
    [A.BAZ]: 56,
    length: 78
} // okay

类型B={[输入A]?:number}&{lengh:number}
这对你有用吗?
let b: B = {
    [A.FOO]: 12,
    [A.BAR]: 34,
    [A.BAZ]: 56,
    length: 78
} // okay