接下来,假设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
之间,一切似乎都很好。
答案 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