在Typescript

时间:2017-07-30 17:03:41

标签: typescript

我有map功能:

const map = <T, U>(f: (x: T) => U, arr: T[]): U[] => {
  return arr.map((val) => f(val));
}

当我使用匿名函数调用map作为回调时,它的返回类型是正确的:

// `x1` variable type here is { name: string }[], which is correct
const x1 = map(x => x, [{name: 'John'}]);

但是当我提供identity函数而不是匿名函数时,返回类型是错误的:

const identity = <T>(x: T) => x
// return type of `x2` is {}[] here
const x2 = map(identity, [{name: 'John'}]);

如何为第二个例子获取正确的类型结果,而不为map函数提供显式类型参数?

1 个答案:

答案 0 :(得分:3)

经过一番尝试,老实说我怀疑TypeScript能够跟你走这么远。 例如:

const x4 = map(identity, [2]);
// x4 is '{}[]'

显然比你的例子更加错误。

其他一些测试:

const x2 = map(<({ name: string }) => { name: string }>identity, [{ name: 'John' }]);
// x2 is '{ name: string }[]'

const double = (x: number) => 2 * x;
const x3 = map(double, [2]);
// x3 is 'number[]'

这让我得出结论,TypeScript不能将所有泛型分解为有意义的类型,只是说 {}