给出以下示例性类:
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
的值作为参数传入。你所要求的是不可能通过其他方式实现的。