Typescript: использовать подмножество строки в качестве [key: subset] - PullRequest
0 голосов
/ 18 апреля 2020

Есть ли способ указать компилятору Typescript, что я хочу использовать в качестве ключа любую строку, кроме определенного значения (подмножество строки). Чтобы получить такой тип, работающий:

{ category: string; [key: Exclude<string, 'category'>]: number }

В этом случае я получаю:

TS1336 Тип параметра подписи индекса не может быть псевдонимом типа. Попробуйте использовать [ключ: строка]: число вместо .

1 Ответ

0 голосов
/ 19 апреля 2020

Вам нужно использовать сопоставленные типы для достижения этого, но также Exclude не будет работать с типом string, оно будет работать только с типом объединения, а строка не является объединением. Результат Exclude<string, 'anything'> будет просто string ниже доказательства.

type StillOnlyString = Exclude<string, 'anything'>

Чтобы добиться исключения, нам нужно предоставить переменную типа, которая будет объединением ключей, которые мы будем иметь в объекте. Рассмотрим:

type WithCategory<Keys extends string> = {category : string} & {
  [K in Exclude<Keys,'category'>]: number
}

const x: WithCategory<'other'> = {
  category: 'str',
  other: 1
}

Возможно, он немного многословен, но мы гарантируем, что поле category всегда будет строковым, а любое другое будет number.

...