基于`number |的联合未定义`不起作用

时间:2018-08-10 13:09:12

标签: typescript

接下来,假设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 :(得分:0)

您在此处使用的功能是tagged (or discriminated) unions。在描述此功能的页面上(添加了重点):

  

判别属性类型保护是形式为xp == v,xp === v,xp!= v或xp!== v的表达式,其中p和v是属性和< strong>字符串文字类型或字符串文字类型的联合。判别属性类型防护将x的类型缩小为具有判别属性p且可能值为v的那些x的构成类型。

该功能旨在用于文字类型。虽然描述在描述中提到了字符串文字类型,但是它已扩展为任何文字类型,所以它也适用:

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