<t>(a:T)=&gt;的区别是什么? U和<a:t =“”> =&gt;你在TypeScript中

时间:2017-11-14 06:33:39

标签: typescript typescript2.0

如标题所述,如果我有一个声明如下的函数:

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

我不知道为什么?你能告诉我他们的不同吗?

1 个答案:

答案 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