在下面的代码中,为什么typeof data.x === 'string'
类型防护不足以区分联合类型?
interface A { x: string, y: number }
interface B { x: number, y: string }
function handler(data: A | B) {
if (typeof data.x === 'string') {
data.y // string | number --- WHUT?
}
}
在什么情况下可以用(无效)形状handler
调用{ x: string: y: string }
?
使用判别式,它起作用(为什么?):
interface A { kind: 'A', x: string, y: number }
interface B { kind: 'B', x: number, y: string }
function handler(data: A | B) {
if (data.kind === 'A') {
data.y // number
}
}
阅读Discriminated Unions上的官方文档无济于事。
他们只说:
某些语言会自动为您区分工会;相反,TypeScript建立在当今存在的JavaScript模式上。
这不能解释为什么在某些情况下TS可以与类似的类型防护一起工作,而在没有工会的情况下(我在第一个示例中没有任何歧义)。