Дискриминационный союз на основе `числа | undefined` не работает

В дальнейшем предполагается, что strictNullChecks включен.

Почему третий пример в

declare const first: undefined | number
const firstNumber: number = first === undefined ? 4 : first

declare const second: { value: undefined } | { value: number }
const secondNumber: number = second.value === undefined ? 4 : second.value

declare const third: { type: undefined, value: undefined } | { type: number, value: number }
const thirdNumber: number = third.type === undefined ? 4 : third.value

вывести ошибку?

Если я заменю третий пример на

declare const third: { type: undefined, value: undefined } | { type: 'x', value: number }
const thirdNumber: number = third.type === undefined ? 4 : third.value

так что размеченное объединение происходит между 'x' | undefined вместо number | undefined, все работает нормально.

1
0
281
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция, которую вы здесь используете, - помеченные (или дискриминированные) союзы. Со страницы, описывающей эту функцию (выделено мной):

A discriminant property type guard is an expression of the form x.p == v, x.p === v, x.p != v, or x.p !== v, where p and v are a property and an expression of a string literal type or a union of string literal types. The discriminant property type guard narrows the type of x to those constituent types of x that have a discriminant property p with one of the possible values of v.

Функция предназначена для работы с литеральными типами. Хотя описание упоминает строковые литералы в описании, но это было расширено до любого литерала, так что это также работает:

declare const thirdx: { type: undefined, value: undefined } | { type: 1, value: number }
const thirdNumberx: number = thirdx.type === undefined ? 4 : thirdx.value

Очевидно, почему!

Werner de Groot 12.08.2018 11:32

Другие вопросы по теме