Создание интерфейса, ключи которого являются значениями перечисления - PullRequest
0 голосов
/ 13 октября 2019

Скажем, у меня есть перечисление

export enum status {
  PENDING = 'pending',
  SUCCESS = 'success',
  FAIL = 'fail'
}

Предположим, что это перечисление используется в нескольких местах (то есть я не могу просто заменить его чем-то другим). Тем не менее, я ожидаю, что другие разработчики будут добавлять / удалять статусы из него в будущем.

Теперь у меня есть объект obj, на который я хочу выглядеть следующим образом

let obj = {
    pending: 10,
    success: 20,
    fail: 0

}

Я хочуопределить интерфейс для объекта. Я мог бы сделать что-то вроде

interface objInterface = {
   [key: string]: number;
}

, однако теперь кто-то может установить для obj значение

obj = {
  flip: 3333
}

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

В идеале я бы сделал что-то вроде

interface objInterface = {
   [key: TransactionStatus] : number;
}

Но это не сработало - выдает эту ошибку:

ключ (параметра): TransactionStatus Тип параметра подписи индекса не может быть типом объединения. Попробуйте вместо этого использовать сопоставленный тип объекта. Ts (1337)

Как лучше всего это сделать?

Я попытался

type objType = {
  [K in keyof typeof status]: number;
};

Но тогда, когдая нахожу над ним, я вижу, что это переводится как

type objType = {
  readOnly PENDING: number,
  readOnly SUCCESS: number,
  readOnly FAIL: number
}

1 Ответ

1 голос
/ 13 октября 2019

Понял

type objType = {
  [K in status]: number;
};
...