我们的应用程序中有一些实体。每个实体为特定类型。例如,我们有:
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[]
类的值。
答案 0 :(得分:3)
问题不在于您的方法,而在于type SearchResults
的定义。您不能将其他成员添加到映射类型定义。所以要纠正错误,请使用交集
export type SearchResults = {
[K in Entities]: any[];
} &
{ total: number; }
documentation。向下滚动,您将看到确切的答案