我不明白为什么TypeScript不允许以下内容:
type aToB = <A, B> (a:A) => B;
const id : aToB = x => x;
我收到错误消息:类型A无法分配给类型B。
但是类型定义type aToB = <A, B> (a:A) => B
并没有说明A必须与B不同。
至少在数学上,像f: A -> B
这样的函数签名并不要求A
与B
不同。像f: Nat -> Nat
这样的函数将是f: A -> B
的合法实例。
TypeScript只是以这种方式很奇怪吗?还是我缺少明显的东西?
答案 0 :(得分:3)
您定义通用函数。具有通用功能的想法是调用方决定具体的类型。所以我可以写:
type aToB = <A, B> (a:A) => B;
declare const id: aToB = x => x;
id<number, string>(0)
在上面的示例中,id
用number
和string
调用,由aToB
定义的签名允许这样做。但这意味着您的实现确实满足调用者的期望,即id
应该返回string
。这就是为什么打字稿不允许您将功能x => x
分配给id
的原因。
您可以将aToB
定义为泛型,然后在将类型分配给变量时确定泛型:
type aToB<A, B> = (a:A) => B;
const id: aToB<number, number> = x => x; // ok now
id(0) // generic types are already set
const id2: aToB<number, string> = x => x; // still would be an error