Тип параметра подписи индекса не может быть типом объединения.Попробуйте вместо этого использовать сопоставленный тип объекта - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь использовать следующий шаблон:

enum Option {
  ONE = 'one',
  TWO = 'two',
  THREE = 'three'
}

interface OptionRequirement {
  someBool: boolean;
  someString: string;
}

interface OptionRequirements {
  [key: Option]: OptionRequirement;
}

Мне это кажется очень простым, однако я получаю следующую ошибку:

Тип параметра подписи индексане может быть типом объединения.Попробуйте вместо этого использовать сопоставленный тип объекта.

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Самое простое решение - использовать Record

type OptionRequirements = Record<Options, OptionRequirement>

Вы также можете реализовать его самостоятельно как:

type OptionRequirements = {
  [key in Options]: OptionRequirement;
}

Эта конструкция доступна только для type, но неinterface.

Проблема в вашем определении заключается в том, что ключ вашего интерфейса должен иметь тип Options, где Options - это перечисление, а не строка, число или символ.

key in Options означает "для тех конкретных ключей, которые входят в параметры типа объединения".

type псевдоним более гибкий и мощный, чем interface.

Если ваш типне нужно использовать в классе, выберите type вместо interface.

0 голосов
/ 17 июня 2019

Вы можете использовать оператор TS "in" и сделать это:

enum Options {
  ONE = 'one',
  TWO = 'two',
  THREE = 'three',
}
interface OptionRequirement {
  someBool: boolean;
  someString: string;
}
interface OptionRequirements {
  [key in Options]: OptionRequirement; // Note that "key in".
}
0 голосов
/ 30 января 2019

Вы не можете использовать enum в качестве ключа.

См. Этот ответ, если вы действительно хотите обходной путь: https://github.com/Microsoft/TypeScript/issues/2491#issuecomment-260864535

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...