Интерфейс Typescript со строковым индексатором, чтобы никогда не иметь определенных c атрибутов (для последующего резервирования) - PullRequest
0 голосов
/ 10 февраля 2020

Всем доброго времени суток,

Итак ... У меня есть интерфейс в машинописи для определения некоторых фильтров, которые я затем отправляю в службу поиска. При этом я надеялся разрешить любые атрибуты, кроме некоторых зарезервированных клавиш.

Я надеялся что-то вроде этого:

export interface IFilters {
  keyword1: never,
  keyword2: never,
  [customAttribute: string]: any;
}

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

1 Ответ

1 голос
/ 10 февраля 2020

Проблема в том, что, объявив тип свойства как never, вы говорите, что свойство по-прежнему требуется , но его тип должен быть never, что на самом деле невозможно. Вместо этого вы можете сказать, что это свойство необязательно и что, если оно указано, его тип должен быть never:

export interface IFilters {
  keyword1?: never,
  keyword2?: never,
  [customAttribute: string]: any;
}

This дает вам желаемое поведение:

const okay: IFilters = {
  keyword3: "foo"
} // okay

const oops: IFilters = {
  keyword4: "bar",
  keyword2: "baz" // error!
  //~~~~~~ <-- string not assignable to undefined
}

Возможная проблема заключается в том, что необязательным свойствам всегда разрешается присваивать значение undefined. Это имеет некоторый смысл, поскольку, если вы прочитаете отсутствующее свойство, значение будет undefined. TypeScript не делает большой разницы между «отсутствующими, но определенными» и «присутствующими, но undefined», см. microsoft / TypeScript # 13195 для обсуждения этого вопроса. Это означает, что будет разрешено следующее:

const alsoAllowed: IFilters = {
  keyword5: "quux",
  keyword1: undefined,  
} // okay

Это, вероятно, не будет большой проблемой на практике, но вы должны по крайней мере знать об этом.


Хорошо , надеюсь, это поможет; удачи!

Детская площадка ссылка на код

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