TypeScript根据参数数量创建类型

丹·普林斯

为什么检查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

游乐场链接

101arrowz

我自己发现这种行为很奇怪,但是问题是TypeScript表示较少的参数是较多参数的子类型。这意味着() => void扩展(x: number) => void,但反之亦然。TypeScript不知道type中参数的值Baz(因为中没有参数typeof baz),因此它说该extends子句为true并设置Tunknown

另一方面,除非子类型元组的每个索引中的类型扩展了超类型元组中相应索引的值,否则元组类型不能真正地互相扩展(即确实是[number & string, number] extends [number, number])。这意味着当有不同数量的参数时,该extends子句始终返回false并使第二个示例正常工作。

这绝对令人困惑,所以这里是一个展示差异游乐场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章