如标题所述,如果我有一个声明如下的函数:
applyTo<T, U>(a: T): (a: T) => U
调用该函数:
applyTo(1)(x => x + '2')
TypeScript会显示错误:
TS2345:Argument of type '(b: number) => number' is not assignable to parameter of type 'number'.
将applyTo
函数的声明更改为以下代码,以修复错误:
applyTo<T, U>(a: T): <T>(a: T) => U
我不知道为什么?你能告诉我他们的不同吗?
答案 0 :(得分:2)
缺少的实施会使事情变得更清晰,但签名......
applyTo<T, U>(a: T): (a: T) => U
说:&#34;给我一些 T ,然后我会给你一个 功能 ,其他一些< strong> T 作为参数并返回一些 U 。&#34;所以你应该传递相同类型T的参数,比如:
applyTo(1)(2) // -> the result must be some U
因为在第一次调用中,一个数字作为参数传递,所以编译器期望另一个数字,而不是来自(x:whatever)=&gt;的函数。 x +&#39; 2&#39;。
第二个签名......
applyTo<T, U>(a: T): <T>(a: T) => U
可能会让人感到困惑,因为在(a:T)=&gt;中命名 T U不一定是(a:T)中的相同类型T:...,如果每个参数和类型参数具有不同的名称,那么会更好:
applyTo<T, U>(a: T): (b: T) => U
applyTo<T, U>(a: T): <S>(b: S) => U
现在第二个签名说:&#34;给我一些 T ,然后我会回复 功能 需要一些 S 作为参数并返回一些 U &#34;
因此,根据实施情况,这将是有效的:
applyTo(1) (x => x + '2') = ...
// ^^^^^^ ^^^^^^^^^^^^^^
// T is number S is function U is whatever;
// from whatever to
// string