为什么我在下面的代码片段中会出现编译错误?
let f: (() => void) | null = null
function g() {
f = () => {}
}
g()
if (f) {
f() // <- Error: "This expression is not callable
// Type 'never' has no call signatures. (2349)"
}
发布于 2021-09-16 17:47:31
因为TypeScript不知道g
分配给f
,所以它为缩小类型而进行的流分析就没有那么深入了。因此,当到达if (f)
时,它认为f
是null
(因为它根据看到的赋值缩小了类型,因此它认为f
在那一点上具有null
类型),因此在if
中,f
的类型进一步缩小到never
(因为TypeScript认为您永远不会进入if
),这是不可调用的。如果在f
条件下将鼠标悬停在if
上(它说类型是null
),然后在if
的主体中悬停(它说类型是never
),就可以看到这一点。
如果您调整了示例,以便类型记录的流分析可以看到f
可能不再是null
,那么错误就会消失:
let f: (() => void) | null = null
if (Math.random() < 0.5) {
f = () => {}
}
if (f) {
f() // <- Error: "This expression is not callable
// Type 'never' has no call signatures. (2349)"
}
我怀疑(但不知道),这只是TypeScript编译器必须确保性能可以接受的几个实际限制之一。杰卡尔兹提供了讨论权衡和问题的这个照亮的环节。接收信息是:控制流分析不跨越功能边界.
https://stackoverflow.com/questions/69212947
复制相似问题