typescript - 基于 `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
所有似乎都可以正常工作。
解决方案
您在此处使用的功能是标记(或区分) 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
推荐阅读
- spring-security - 已弃用:KeyStoreKeyFactory 已弃用
- dataset - 如何在其中一个数据集中设置图表选项?
- php - #PBS scipts 没有输出
- python - django.core.exceptions.ImproperlyConfigured: Cannot import 'category'. Check that 'api.category.apps.CategoryConfig.name' is correct
- swift - 从 Vimeo Swift 5 中的文件夹中检索视频列表
- python - 如何更改 discord-py-slash 命令的顺序
- android - Android 外部存储权限即将发生的变化
- r - 如何在 Rstudio 中使用 grep 和 fread?
- matplotlib - 为新闻散布图添加标签
- javascript - 如何使我的随机图像选择器从随机选择变为顺序选择?