type Id = <A>(a: A) => A
const id: Id = (a: number) => a;
如果我以这种方式使用泛型,则编译器将返回错误提示
Type '(a: number) => number' is not assignable to type 'Id'.
Types of parameters 'a' and 'a' are incompatible.
Type 'A' is not assignable to type 'number'.
我知道可以解决
type Id<A> = (a: A) => A
但是,如果我不能每次都声明A怎么办。有没有办法让它流过或被推断出来?
答案 0 :(得分:1)
我认为您遇到的是这两个类型定义之间的区别。
type Func1<A> = (a: A) => A;
type Func2 = <A>(a: A) => A;
任何类型为Func1<A>
的函数都必须在定义时指定其类型。
const func1: Func1<number> = (a: number): number => a;
func1(10); // works
func1("x"); // fails - we already decided it is of type `number`
Func2
类型的任何东西都不得指定其类型,直到被调用。
const func2: Func2 = <X>(a: X): X => a;
func2(10); // works
func2("x"); // works
这里是playground link that illustrates。
发生的问题是因为您试图在定义函数时而不是在调用函数时指定函数的类型。