【发布时间】:2019-09-13 12:53:33
【问题描述】:
有一个联合类型的 Typescript 变量A
type A = {
b: true
x: number
} | {
b: false
x: string
}
declare const v: A
我可以正确地将属性 x 分配给正确的类型,方法是使用 if 判别块检查属性 b 值类型以保护 type A 一致性
if (v.b) { // v.x is number
// ok for compiler
v.x = 3
// compiler error as v.x should be number
v.x = ''
} else { // v.x is string
// compiler error as v.x should be string
v.x = 3
// ok for compiler
v.x = ''
}
外部判别块 v.x 正确显示为 number | string
但是,编译器不会抱怨将x 分配给number | string,尽管这会破坏type A 的一致性
v.x = 3 // ok for compiler
v.x = '' // ok for compiler
有没有办法强制编译器拒绝这个?
check it out on typescriptlang.org/play
【问题讨论】:
-
虽然我确实认为这本身就是一个有趣的问题,但同时这确实感觉像 XY problem 所以如果你提供一点动机或背景可能会很有用你正在努力实现。也许您可以使用更合适的语法。
-
@apokryfos 这是一个普遍的问题,当开发人员仔细检查判别属性时,它可以简单地解决......关键是我希望 TS 编译器保持类型一致性 - 在编译时 -当类型定义明确时,毕竟这是 Typescript 的主要目的之一......显而易见的场景是:一个开发团队正在开发一个涉及
type A的代码库,我想尽可能多地删除运行时错误可能我只是想知道是否有办法避免这个问题,或者它是否是 Typescript 功能缺乏 -
@Oleg 你能扩展你的建议吗?
-
我的意思是,microsoft/TypeScript#9825 谈到了不正确的 TypeScript 行为的一般案例以及为什么它不能被消除,但我不能确定它是否与这个特定的实例。
标签: typescript union-types data-consistency