在catch中的类成员上类型'从不'?

时间:2017-03-25 21:32:18

标签: typescript compiler-errors try-catch

TypeScript版本2.2.1。

我刚刚开始尝试使用TypeScript,并且不断收到我不明白的错误。我将strictNullChecks设置为true,因为我想定义哪些类型可以为空。所以我有这个课程:

class Core {
    client: MessagesClient | null;

    connect(server: string, port: number, connectionHandler: ConnectionHandler) {
        if(this.client) {
            this.client.disconnect(false, "New connection");
            this.client = null;
        }

        try {
            this.client = new MessagesClient(server, port);
            functionWhichCanThrow(); //I.e, lot of other code which I didn't include    
        } catch(exception) {
            let error = "Error while setting up connection: " + exception;
            if(this.client) {
                this.client.disconnect(true, error);
                this.client = null;
            }
        }
    }
}

出于某种原因,在catch语句中,TypeScript编译器坚持认为this.client永远不能是null。因此this.client.disconnect会抛出一个错误:错误TS2339:'never'类型中不存在属性'disconnect'。

如果它抛出异常,我想断开连接,这可能发生在设置this.client之后的任何时候。

在连接开始时不将this.client设置为null会删除错误,但我想了解为什么会发生这种情况。 我在这里忽略了一些完全明显的东西吗?

编辑: 另一个较短的例子

class Test {
    test: string | null;

    doTest() {
        this.test = null;
        try {
            this.test = "test";
            throw new Error("");
        } catch(e) {
            if(this.test) //Visual Studio Code say that this is "null", not "string | null"
                this.test.replace("test", "error"); 
        }
    }
}

1 个答案:

答案 0 :(得分:2)

在这种情况下,类型检查器不考虑try块内的代码,因为此块已失败。 "最后一个已知的好代码"与test属性相关的是this.test = null块之前的try。例如,如果将其更改为this.test = "...",则可以使用。

要解决此问题,您需要使用! post-fix运算符:

this.test!.replace("test", "error");