为什么有时需要在子函数范围内再次进行类型缩小.
我在下面的示例中编写了三个函数:
interface Obj {
func?: Function;
}
const arr = [1, 2, 3];
function test1 (obj: Obj){
if (obj.func !== void 0){
arr.forEach(key => {
obj.func(key); // error, TS2722: Cannot invoke an object which is possibly 'undefined'.
});
}
}
function test2 (obj: Obj){
if (obj.func !== void 0){
arr.forEach(key => {
if (obj.func !== void 0) { // do narrowing again
obj.func(key); // ok
}
});
}
}
function test3 (func?: Function){
if (func !== void 0){
arr.forEach(key => {
func(key); // ok, no second time narrowing
});
}
}
如您所见,在函数test1
中,我们在函数体中进行类型缩小,但在forEach
的回调函数中不再进行,而回调函数是另一个函数作用域,并且
然后在函数test3
中,我将参数从一个对象更改为一个可选参数
有人能解释一下为什么在test1
年后我需要再次缩小字体吗?