打字稿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,我不太了解。有什么方法可以使这种情况起作用?
答案 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
,则此代码无效。
为了进一步阅读,我们在这里处理的概念称为类型逆变。