TypeScript回调参数签名导致类型检查失效问题咨询
TypeScript 2.8@next 类型推断失效问题分析
我之前也碰到过类似的预发布版本类型系统问题,咱们先把你描述的场景还原出来,再聊聊原因和临时解决办法:
原本正常工作的代码
在没有给回调函数加参数时,myResult能被正确推断为string类型,类型检查完全正常:
function fetchData(callback: () => string) { return callback(); } const myResult = fetchData(() => { return "Hello TypeScript"; }); // 此时myResult的类型是string,编辑器能正常提示类型相关信息
添加参数后出现问题的代码
一旦给回调函数新增一个参数,类型推断直接失效——myResult会被推断为any,而且没有任何有效错误提示:
function fetchData(callback: (id: number) => string) { return callback(123); } const myResult = fetchData((id) => { return "Hello TypeScript"; }); // 此时myResult被推断为any,类型检查完全不起作用
问题原因推测
这大概率是TypeScript 2.8@next版本中类型推断器的边缘场景bug。TypeScript的类型推断逻辑非常复杂,在预发布版本迭代新特性时,很容易出现这类“带参数的回调函数返回值无法正确传递到最终变量”的疏漏。
临时解决办法
可以通过两种方式强制恢复类型检查:
- 显式指定回调函数的返回类型:
const myResult = fetchData((id): string => { return "Hello TypeScript"; });
- 给函数添加泛型约束,明确返回值类型关联:
function fetchData<T>(callback: (id: number) => T): T { return callback(123); } const myResult = fetchData((id) => { return "Hello TypeScript"; }); // 此时myResult会被正确推断为string
这类预发布版本的bug通常会在正式发布前被修复,你也可以在TypeScript的官方仓库里搜索相关issue,或者提交新反馈帮助团队定位问题。
内容的提问来源于stack exchange,提问作者christianalfoni
相关产品推荐
相关产品推荐

