见这个例子:
const strings = ['1', '2', 2];
const mapper = (s: string) => parseInt(s, 10);
const numbers1 = strings.map(mapper);
const numbers2 = strings.map(s => mapper(s));
通过此示例,numbers1
类似于typecheck的行很好,因为strings
的类型为(string | number)[]
,mapper
只接受{{1}参数。
但是,如果我在string
处使用lambda,我会收到预期的错误,因为numbers2
类型为s
,无法传递到(string | number)
。
是否有这样的原因,或者是否有一些“严格”的配置来获得预期的错误,或者它只是一个错误?
要运行该示例,请参阅:playground link
答案 0 :(得分:2)
TypeScript github上存在类似的问题/建议(例如:https://github.com/Microsoft/TypeScript/issues/1394)。
目前,(s: string) => any
已隐式转换为(s: string | number) => any
。任何泛型参数的TypeScript编译器都认为它可以转换为“更宽”类型(协方差)。但对于功能参数相反的事物应该起作用(逆变)。目前TypeScript不支持它。