type Animal = {
[key: string]: string;
};
Вообще синтаксис такой:
type Animal = {
[<любое имя>: <тип ключей>]: <тип значений>;
};
Имя должно быть валидным идентификатором, зачем оно нужно TS - я хз, но без него не ест
тип ключей должен быть подтипом
string | number | symbol
, притом с symbol есть траблы, там только юнион из конкретных символов
тип значений - любой тип, но должен не пересекаться с типами явных полей
явные поля должны быть до универсального
А вообще в стандартной библиотеке есть утилити тип Record с двумя дженерик аргументами - тип ключей и тип значений, притом у него нет траблов с symbol:
type Animal = Record<string, string>;