代码之家  ›  专栏  ›  技术社区  ›  Reza

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

  •  3
  • Reza  · 技术社区  · 7 年前

    title order

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

    稍后会这样分配(这只是我的read应用程序中的一个示例,其中会有一个循环,键来自restapi)

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

    我犯了个错误

    “string”类型的属性“title”不可分配给字符串索引类型“number”

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   Willwsharp    7 年前

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

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

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

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

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

    编辑:你也可以厚颜无耻,走捷径,简单地使用联合类型。所以 [key:string]: number 你知道吗 [key:string]: number | string .