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