我注意到用户在联合类型上定义的typeguard没有对称行为的问题。我希望这是我的错误: - /
问题显示在test2()
,其中类型未通过打字机正确推断。
class PropPacket {
constructor(public key: string, public value: number) {}
}
class EventPacket {
constructor(public key: string) {}
}
type Packet = PropPacket | EventPacket;
function isPropPacket(p: EventPacket | PropPacket): p is PropPacket {
return p instanceof PropPacket;
}
function isEventPacket(p: EventPacket | PropPacket): p is EventPacket {
return p instanceof EventPacket;
}
function test1(p: Packet) {
if (isPropPacket(p)) {
// `p` is PropPacket
p.key;
p.value;
} else {
// `p` is EventPacket
p.key;
}
}
function test2(p: Packet) {
if (isEventPacket(p)) {
p.key;
} else {
// ERROR: thinks `p` is `never` type
p.key;
p.value;
}
}
您可以通过粘贴打字稿操场(https://www.typescriptlang.org/play/)
中的代码来查看问题答案 0 :(得分:1)
这是因为所有EventPacket
实际上都是PropertyPacket
。 Typescript有一个结构类型系统,它不考虑两个类通过声明来区分,只考虑它们包含的属性和方法。