在共享代码(Playground Link)中编译器抛出错误Object is possibly 'null'.
如果函数中为 null时有提前返回,是否有任何情况可以refresh
调用,以便可以为 null ?viewer
viewer
topLayer
如果不是,在嵌套函数的情况下,打字稿不缩小范围的原因可能是什么?
在共享代码(Playground Link)中编译器抛出错误Object is possibly 'null'.
如果函数中为 null时有提前返回,是否有任何情况可以refresh
调用,以便可以为 null ?viewer
viewer
topLayer
如果不是,在嵌套函数的情况下,打字稿不缩小范围的原因可能是什么?
这里有点接近,但显然不是相同且高度人为的示例:
declare var viewer: { key: string } | null;
let _viewer = { key: 'key' } as { key: string } | null
Object.defineProperty(window, 'viewer', {
get() {
const val = _viewer;
_viewer = null;
return val
}
})
function topLayer() {
if (!viewer) return;
function refresh() {
console.log(viewer.key); // shows `Cannot read property 'key' of null` error
}
refresh();
}
topLayer();
尽管实际上打字稿使用一些启发式方法来缩小类型,但显然不会以所有可能的viewer
变量值运行您的程序。新函数为仍然没有缩小的自由变量(不是局部变量,不是参数)refresh
创建新的范围。viewer
如果将其重写为:
function topLayer() {
if (!viewer) return;
function refresh(viewer: { key: string }) {
console.log(viewer.key);
}
refresh(viewer);
}
一切都按预期工作。