这是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
相关产品推荐
相关产品推荐

