Я могу описать ограничение индексированного типа в нотации типа объекта, например, следующее:
enum Enum {
A = 0,
B = 1,
}
type EnumMap = {
[P in Enum]: string;
}
Но, что удивительно, то же самое кажется невозможным при использовании индексной нотации в интерфейсе:
enum Enum {
A = 0,
B = 1,
}
interface EnumMap {
[P in Enum]: string;
}
Ошибка:
Имя вычисляемого свойства должно иметь тип 'string', 'number', 'symbol' или 'any'.
Есть ли причина, почему это так?По определению, перечисления в TypeScript могут иметь только строковые или числовые значения (или даже оба, но это не рекомендуется), и я подумал, что само перечисление будет работать как тип объединения для всех перечисленных значений.
Исследуя немного подробнее, я также обнаружил, что в следующем примере EnumValues
имеет тип number
вместо (как я ожидал) 0 | 1
.Опять же, почему это так?
const Enum = {
A: 0,
B: 1
};
type EnumKeys = keyof typeof Enum;
type EnumValues = typeof Enum[EnumKeys];