为什么TypeScript中传函数引用与lambda包装调用时重载匹配结果不同
TypeScript 4.4.4 重载匹配问题解答
核心原因
TypeScript 4.4.4 在处理作为值传递的重载函数时,不会基于接收方的参数类型做上下文感知的重载匹配,只会默认取重载列表的最后一个签名作为函数的整体类型,这就是两种map写法返回类型不同的根因。
两种写法的推导过程拆解
第一种写法:
['a', 'b', 'c'].map(x => f(x));- 数组类型为
string[],因此回调的入参x的类型被明确推导为string - 这里是直接调用
f,TS 会按照重载顺序优先匹配最精准的签名:f(x: string): string - 回调返回值类型为
string,最终map返回值类型就是string[]
- 数组类型为
第二种写法:
['a', 'b', 'c'].map(f);- 这里是把
f作为值直接传给map作为回调,没有显式的调用参数上下文 - TS 4.4.4 对这种场景的重载处理逻辑是:直接取重载列表的最后一个签名
f(x: string | null): string | null作为f的整体类型 - 该签名的入参
string | null兼容回调要求的string类型(string是前者的子类型),因此匹配通过 - 回调返回值类型为
string | null,最终map返回值类型就是(string | null)[]
- 这里是把
修复方案
如果要在直接传f的场景下得到正确的string[]类型,可以手动指定map的泛型参数:
['a', 'b', 'c'].map<string>(f);
内容的提问来源于stack exchange,提问作者Eemeli Kantola
相关产品推荐
相关产品推荐

