У нас есть несколько объектов в нашем приложении. Каждая сущность как особый тип. Например, у нас есть:
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[].






Проблема не в вашем подходе, а в определении type SearchResults. Вы не можете добавлять дополнительные элементы в определение сопоставленного типа. Поэтому для исправления ошибок используйте пересечение
export type SearchResults = {
[K in Entities]: any[];
} &
{ total: number; }
документация. Прокрутите вниз и вы увидите точный ответ