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

时间:2018-10-31 19:25:30

标签: typescript typescript-typings

我有一个对象,该对象具有title作为字符串和order作为数字,然后在其上将具有数字类型的动态属性数

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

appraisalGroups: Array<{
    title: string,
    order: number,
    [key:string]: number,
}>;

然后将对此进行分配(这只是我的读取应用程序中的一个示例,会有一个循环,并且密钥来自其他api)

this.appraisalGroups[0]['mykey1'] = 5

我遇到了ts错误

  

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

我的问题是如何输入?

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

1 个答案:

答案 0 :(得分:2)

之所以会这样,是因为索引签名会强制所有属性匹配其返回类型。如Typescript文档所述:https://www.typescriptlang.org/docs/handbook/interfaces.html

  

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

索引签名基本上是告诉编译器可以通过这种方式访问​​此Object的属性,结果将如下所示。因此,为什么不能拥有带有返回数字的索引签名的字符串属性。您要限制Object返回给定索引的数字,该数字是字符串。

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

编辑:您也可能很厚脸皮,走捷径,仅使用Union类型。因此,您不用[key:string]: number,而是[key:string]: number | string