如何在 TypeScript 中为具有动态属性的对象定义类型

Rez*_*eza 8 typescript typescript-typings

我有一个对象,它具有title字符串和order数字,然后会有动态数量的数字类型的属性

所以我试着像下面这样定义它

appraisalGroups: Array<{
    title: string,
    order: number,
    [key:string]: number,
}>;
Run Code Online (Sandbox Code Playgroud)

稍后这将像这样分配(这只是我的读取应用程序中的一个示例,将有一个循环,并且密钥来自其余 api)

this.appraisalGroups[0]['mykey1'] = 5
Run Code Online (Sandbox Code Playgroud)

我得到了 ts 错误

“字符串”类型的属性“标题”不可分配给字符串索引类型“数字”

我的问题是如何输入?

https://stackblitz.com/edit/angular-mzdwmn

Wil*_*arp 5

你得到这个是因为索引签名强制所有属性匹配它们的返回类型。如 Typescript 文档所述:https ://www.typescriptlang.org/docs/handbook/interfaces.html

虽然字符串索引签名是描述字典模式的一种强大方式,但它们也强制所有属性匹配它们的返回类型。

索引签名明确表示“每当此对象使用此类型的值进行索引时,它将返回该类型的值”。

在您的示例中,您的索引签名表示“每当使用字符串索引此对象时,它将返回一个数字”。但是,编译器发现此规则可能会被破坏,因为您的属性之一不是数字,因此会引发错误。

我不确定你的问题空间是什么,但如果动态属性都有一些共同点,那么创建一个接口来抽象它们的共同点可能会更容易。您如何使用所述界面实际上取决于您想要做什么。

编辑:你也可以厚脸皮,走捷径,简单地使用联合类型。所以,而不是[key:string]: number你做[key:string]: number | string