ユニオンタイプのユーザー定義型ガードが対称的に動作しないという問題が発生しました。私はこれが私の最終的なエラーです: -/Typescriptコンパイラでこれがエラーですか?
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;
}
}
すべてEventPacket
sが実際にPropertyPacket
秒ですので、これが起こる(https://www.typescriptlang.org/play/)
興味深い。私は言語弁護士ではありませんが、価値のあるものについては、 'Packet'型の' key'プロパティの名前を何か他のものに変更すると期待しているように振る舞います。 'key2'。 – cynic