Typescript功能扩展已损坏

时间:2020-07-18 09:18:03

标签: typescript function extends

打字稿3.9.4:

type Test = ((value: { a: number }) => any) extends ((value: { [key: string]: any }) => any) ? true : false;

由于{a: number}确实extends {[key: string]: any},所以测试的预期类型为true。

Test的实际类型是false,我不太了解。有什么方法可以使这种情况起作用?

1 个答案:

答案 0 :(得分:0)

这种类型不会扩展其他类型。

我们可以想象{ a: number } 确实扩展了{ [key: string]: number },方法是想象调用一个具有如下签名的函数:

foo(arg: { [key: string]: number })

提供类型{ a: number }的参数将是有效的。 foo对其参数所做的任何事情也将与类型{ a: number }的事物有关。

但是,如果您有:

foo(arg: (value: { [key: string]: number }) => any)

提供类型(value: { a: number }) => any的参数将是无效的,因为foo的参数需要一个能够接受带有任何字符串键的对象的函数。想象一下foo是这样实现的:

foo(arg: (value: { [key: string]: number }) => any) {
  arg({ b: 7 });
}

如果arg的类型为(value: { a: number }) => any,则此代码无效。

为了进一步阅读,我们在这里处理的概念称为类型逆变