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");
}
}
}
答案 0 :(得分:2)
在这种情况下,类型检查器不考虑try块内的代码,因为此块已失败。 "最后一个已知的好代码"与test
属性相关的是this.test = null
块之前的try
。例如,如果将其更改为this.test = "..."
,则可以使用。
要解决此问题,您需要使用!
post-fix运算符:
this.test!.replace("test", "error");