为什么类型A => B的fn不允许x => x?

时间:2018-11-06 17:11:56

标签: typescript

我不明白为什么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这样的函数签名并不要求AB不同。像f: Nat -> Nat这样的函数将是f: A -> B的合法实例。

TypeScript只是以这种方式很奇怪吗?还是我缺少明显的东西?

1 个答案:

答案 0 :(得分:3)

您定义通用函数。具有通用功能的想法是调用方决定具体的类型。所以我可以写:

type aToB = <A, B> (a:A) => B;
declare const id: aToB = x => x;
id<number, string>(0)

在上面的示例中,idnumberstring调用,由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