这是Typescript编译器中的错误

时间:2016-11-01 21:47:57

标签: typescript2.0

我注意到用户在联合类型上定义的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/

中的代码来查看问题

1 个答案:

答案 0 :(得分:1)

这是因为所有EventPacket实际上都是PropertyPacket。 Typescript有一个结构类型系统,它不考虑两个类通过声明来区分,只考虑它们包含的属性和方法。