Использование enum в качестве ключа словаря - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь создать гарантированный поиск для данного перечисления.Например, в поиске должно быть ровно одно значение для каждого ключа перечисления.Я хочу гарантировать это через систему типов, чтобы не забыть обновить поиск при расширении enum.Я попробовал это:

type EnumDictionary<T, U> = {
    [K in keyof T]: U;
};

enum Direction {
    Up,
    Down,
}

const lookup: EnumDictionary<Direction, number> = {
    [Direction.Up]: 1,
    [Direction.Down]: -1,
};

Но я получаю эту странную ошибку:

Тип '{[Direction.Up]: число;[Direction.Down]: номер;} 'нельзя назначить типу' Direction '.

Мне это кажется странным, поскольку он говорит, что тип lookup должен быть Direction вместо EnumDictionary<Direction, number>.Я могу подтвердить это, изменив объявление lookup на:

const lookup: EnumDictionary<Direction, number> = Direction.Up;

, и ошибок нет.

Как создать тип поиска для перечисления, гарантирующего каждое значение изenum приведет к другому значению другого типа?

Версия TypeScript: 3.2.1

Ответы [ 2 ]

0 голосов
/ 01 августа 2019
enum FunStuff {
  PARTY = "party",
  CAKE = "cake",
  PIZZA = "pizza",
}

Итак, если вы хотите, чтобы все ваши значения Enum были обязательными

type MapOfFunStuff = {
  counts: { [key in FunStuff] : number };
}

Тогда, если вы хотите, чтобы значения в вашем перечислении были только значениями, но любое их количество можно было добавить?

type MapOfFunStuff = {
  counts: { [key in FunStuff]? : number };
}
0 голосов
/ 05 февраля 2019

Вы можете сделать это следующим образом:

type EnumDictionary<T extends string | symbol | number, U> = {
    [K in T]: U;
};

enum Direction {
    Up,
    Down,
}

const a: EnumDictionary<Direction, number> = {
    [Direction.Up]: 1,
    [Direction.Down]: -1
};

Я находил это удивительным, пока не понял, что перечисления можно рассматривать как специализированный тип объединения .

Другое изменение состоит в том, что сами типы перечислений фактически становятся объединением каждого члена перечисления.Хотя мы еще не обсуждали объединяемые типы, все, что вам нужно знать, это то, что с объединяющими перечислениями система типов может использовать тот факт, что она знает точный набор значений, которые существуют в самом перечислении.

EnumDictionary, определенный таким образом, в основном является встроенным Record типом:

type Record<K extends string, T> = {
    [P in K]: T;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...