Использовать перечисление для ввода подписи индекса поля интерфейса? - PullRequest
0 голосов
/ 28 ноября 2018

Я могу описать ограничение индексированного типа в нотации типа объекта, например, следующее:

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];
...