You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

这是TypeScript编译器的Bug吗?高阶函数联合类型问题

问题解析:TypeScript未检测到函数参数类型不匹配的原因

先看你提供的代码:

function toNumber(input: 'a' | 'b'): number {
  switch (input) {
    case 'a':
      return 1;

    case 'b':
      return 2;
  }
}

function bar(toNumber: (input: 'a' | 'b' | 'c') => number): number {
  return toNumber('c');
}

bar(toNumber); // No typescript error, but returns `undefined`

这不是TypeScript的编译器Bug,而是默认配置下的预期行为,核心原因是函数参数的双向协变规则:

  • 默认情况下(未开启strictFunctionTypes),TypeScript允许函数参数类型双向协变——既可以把接受更宽参数的函数传给需要窄参数的位置,也允许反过来。你的例子中,toNumber只接受'a'|'b',但bar要求传入的函数能处理'a'|'b'|'c',双向协变规则允许这种赋值,所以编译器不报错,但运行时传入'c'会导致toNumber无匹配分支,返回undefined。

  • 若开启strictFunctionTypes配置(开启strict: true时会自动启用),TypeScript会强制执行严格的逆变规则:只有接受更宽参数类型的函数才能适配需要窄参数的场景,反过来则不允许。此时编译器会正确检测到类型不匹配,抛出错误。

解决方法:在tsconfig.json中添加或修改配置:

{
  "compilerOptions": {
    "strict": true, // 或单独开启 "strictFunctionTypes": true
    // 其他配置...
  }
}

该行为是TypeScript的设计选择,相关讨论已在官方仓库中存在,无需新建Issue。

内容的提问来源于stack exchange,提问作者mauroc8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:02:47