首页 > 解决方案 > 基于 `number | 的可区分联合 未定义`不起作用

问题描述

在下文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所有似乎都可以正常工作。

标签: typescript

解决方案


您在此处使用的功能是标记(或区分) unions。从描述此功能的页面(已添加重点):

判别属性类型保护是 xp == v、xp === v、xp != v 或 xp !== v 形式的表达式,其中 p 和 v 是属性和字符串文字类型的表达式或字符串文字类型的联合。判别属性类型保护将 x 的类型缩小到 x 的那些组成类型,这些组成类型具有判别属性 p 和 v 的可能值之一。

该功能旨在与文字类型一起使用。虽然描述在描述中提到了字符串文字类型,但这已扩展到任何文字类型,因此这也有效:

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

推荐阅读