Как быстро отличить интерфейсы с неперекрывающимися свойствами - PullRequest
2 голосов
/ 09 июля 2019

В машинописном тексте у меня обычно есть переменная с типом:

const variable: { a: string } | { b: number };

Когда я хочу проверить, какую форму имеет переменная, я обычно хочу сделать

if (variable.a !== undefined) {
  // do stuff
}
else {
  // do stuff

Однако в строгом режиме машинопись выдает ошибку типа variable.a, поскольку variable, как известно, не обладает свойством a.Чтобы обойти это, я обычно использую any как (variable as any).a !== undefined.Однако машинопись не рассматривает это как защиту типов и не сужает тип variable.

Существует ли «правильный» способ сделать эту проверку в машинописи в строгом режиме (безнастраиваемый тип защиты)?

Некоторые примеры, которые я пробовал (которые, к сожалению, также вызывают ошибки типа):

  • typeof variable.a !== 'undefined'
  • variable.hasOwnProperty('a')

1 Ответ

1 голос
/ 09 июля 2019

Простейшим способом различения в этом случае будет охрана типа in:

declare const variable: { a: string } | { b: number };


if ('a' in variable) {
    variable.a
}
else {
    variable.b
}
...