Проблема в том, что, объявив тип свойства как 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
Это, вероятно, не будет большой проблемой на практике, но вы должны по крайней мере знать об этом.
Хорошо , надеюсь, это поможет; удачи!
Детская площадка ссылка на код