如何在列表中键入具有属性的对象

时间:2019-07-11 23:21:45

标签: typescript

我们的应用程序中有一些实体。每个实体为特定类型。例如,我们有:

export class Tree {
  constructor(public size: number, public name: string) {}
}

export class Animal {
  constructor(public region: string, public name: string) {}
}

我们正在为我们的应用创建全局搜索,以便我们可以搜索任何实体。

我们的后端返回一个带有以下示例的列表:

{
  total: 3,
  Tree: [{ some tree data here }],
  Animal: [{ some animal data here}]
}

我想在前端的打字稿中键入此结果对象,而我努力使其工作:如何指示我的SearchResult可以具有未知数量的“实体类型”,每个实体包含这些实体的数组?

我尝试定义一种列出所有可能实体的类型:

export type Entities = 'Tree' | 'Animal';

然后尝试将其用作新类型的键:

export type SearchResults = {
  total: number;
  [K in Entities]: any[];
}

但是它会触发以下错误:

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'.

而且我无法使用K而不是Tree[]恢复Animal[]any[]类的值。

1 个答案:

答案 0 :(得分:3)

问题不在于您的方法,而在于type SearchResults的定义。您不能将其他成员添加到映射类型定义。所以要纠正错误,请使用交集

export type SearchResults = {
  [K in Entities]: any[];
} &
{ total: number; }

documentation。向下滚动,您将看到确切的答案