1

在共享代码(Playground Link)中编译器抛出错误Object is possibly 'null'.

如果函数中为 null时有提前返回,是否有任何情况可以refresh调用,以便可以为 null ?viewerviewertopLayer

如果不是,在嵌套函数的情况下,打字稿不缩小范围的原因可能是什么?

4

1 回答 1

2

这里有点接近,但显然不是相同且高度人为的示例:

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);
}

游乐场链接

一切都按预期工作。

于 2021-06-28T14:05:05.410 回答