在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"); 
        }
    }
}

最佳答案 在这种情况下,类型检查器不考虑try块内的代码,因为此块已失败.与test属性相关的“最后已知良好代码”是:try.test = null在try块之前.例如,如果将此更改为this.test =“…”,它将起作用.

要解决它,你需要使用!修复后运算符:

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