首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的TypeScript键入问题(TS错误代码2349)

奇怪的TypeScript键入问题(TS错误代码2349)
EN

Stack Overflow用户
提问于 2021-09-16 17:42:36
回答 1查看 267关注 0票数 1

为什么我在下面的代码片段中会出现编译错误?

代码语言:javascript
运行
复制
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)"
}

TypeScript游乐场演示

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-16 17:47:31

因为TypeScript不知道g分配给f,所以它为缩小类型而进行的流分析就没有那么深入了。因此,当到达if (f)时,它认为fnull (因为它根据看到的赋值缩小了类型,因此它认为f在那一点上具有null类型),因此在if中,f的类型进一步缩小到never (因为TypeScript认为您永远不会进入if),这是不可调用的。如果在f条件下将鼠标悬停在if上(它说类型是null),然后在if的主体中悬停(它说类型是never),就可以看到这一点。

如果您调整了示例,以便类型记录的流分析可以看到f可能不再是null,那么错误就会消失:

代码语言:javascript
运行
复制
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编译器必须确保性能可以接受的几个实际限制之一。杰卡尔兹提供了讨论权衡和问题的这个照亮的环节。接收信息是:控制流分析不跨越功能边界.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69212947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档