在函数中检查变量时满足TS-Compiler



给出以下示例性类:

export class Inference {
private counter?: number;
initializeCounter() {
this.counter = 0;
}
addNumberToCounter(boost: number) {
if(typeof this.counter === "number") {
this.counter += boost;
}
}
}

通过选择if(typeof this.counter === "number"),我可以安全地将boost参数添加到this.counter。TS-Compiler知道this.counter的类型是number

如果我提取一个函数的选择条件,TS-Compiler不能再验证this.counter的设置。

addNumberToCounter(boost: number) {
if(this.isCounterSet()) {
this.counter += boost;
}
}
private isCounterSet() {
return typeof this.counter === "number";
}

是否有一种方法来满足ts编译器,如果选择结果来自一个单独的函数?

您可以将isCounterSet()更改为自定义类型保护。可以这样做:

addNumberToCounter(boost: number) {
if(this.isCounterSet(this.counter)) {
this.counter += boost;
}
}
private isCounterSet(counter?: number): counter is number {
return typeof this.counter === "number";
}

这需要您更改isCounterSet,以便将this.counter的值作为参数传入。你所要求的是不可能通过其他方式实现的。

最新更新