看这个例子:
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
的行类型检查正常,它不应该因为 strings
的类型为 (string | number)[]
,而 mapper
只接受 string
参数。
但是,如果我在 numbers2
处使用 lambda,我会得到预期的错误,因为 s
是 (string | number)
类型,它可以不会被传递到 mapper
。
这是有原因的,还是可能有一些“严格”的配置来获得预期的错误,或者这只是一个错误?
要运行该示例,请参阅:playground link
最佳答案
TypeScript github 上有类似的问题/提案(例如:https://github.com/Microsoft/TypeScript/issues/1394)。
目前你有 (s: string) => any
隐式转换为 (s: string | number) => any
。并且任何泛型参数的 TypeScript 编译器都认为它可以转换为“更宽”的类型(协变)。但是对于函数参数,相反的事情应该起作用(逆变)。目前 TypeScript 不支持它。
关于typescript - 不一致的输入 [...].map() 点自由或箭头功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41058690/