为什么检查0变量函数是否扩展1变量类型时,extends子句成功?
有什么办法可以使第一个表格起作用?
对元组的相同检查可以按我期望的方式工作,因此可以Parameters
代替使用,但我对原因感到好奇。
function foo(bar: number) {
// ...
}
function baz() {
// ...
}
type Foo = typeof foo extends (bar: infer T) => void ? T : never; // number - expected number
type Baz = typeof baz extends (bar: infer T) => void ? T : never; // unknown - expected never
type Foo2 = Parameters<typeof foo> extends [infer T] ? T : never; // number - ok
type Baz2 = Parameters<typeof baz> extends [infer T] ? T : never; // never - ok
我自己发现这种行为很奇怪,但是问题是TypeScript表示较少的参数是较多参数的子类型。这意味着() => void
扩展(x: number) => void
,但反之亦然。TypeScript不知道type中参数的值Baz
(因为中没有参数typeof baz
),因此它说该extends
子句为true并设置T
为unknown
。
另一方面,除非子类型元组的每个索引中的类型扩展了超类型元组中相应索引的值,否则元组类型不能真正地互相扩展(即确实是[number & string, number] extends [number, number]
)。这意味着当有不同数量的参数时,该extends
子句始终返回false并使第二个示例正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句