基于参数数量创建类型的TypeScript
为什么在检查0-arity函数是否扩展1-arity类型时extends子句成功 有没有办法让第一张表格生效 对元组的检查和我预期的一样有效,因此我可以使用基于参数数量创建类型的TypeScript,typescript,Typescript,为什么在检查0-arity函数是否扩展1-arity类型时extends子句成功 有没有办法让第一张表格生效 对元组的检查和我预期的一样有效,因此我可以使用参数,但我很好奇为什么 函数foo(条:编号){ // ... } 函数baz(){ // ... } 类型Foo=类型Foo扩展(条:推断T)=>void?T:从来没有数字-预期数字 Baz类型=Baz扩展的类型(条:推断T)=>void?T:从来没有未知-期待永远不会 类型Foo2=参数扩展[推断T]?T:从来没有号码-好的 类型Baz2
参数
,但我很好奇为什么
函数foo(条:编号){
// ...
}
函数baz(){
// ...
}
类型Foo=类型Foo扩展(条:推断T)=>void?T:从来没有数字-预期数字
Baz类型=Baz扩展的类型(条:推断T)=>void?T:从来没有未知-期待永远不会
类型Foo2=参数扩展[推断T]?T:从来没有号码-好的
类型Baz2=参数扩展[推断T]?T:从来没有永远不好
我自己也觉得这种行为很奇怪,但问题是TypeScript说更少的参数是更多参数的子类型。这意味着,
()=>void
扩展了(x:number)=>void
,但反之亦然。TypeScript不知道typeBaz
中参数的值(因为typeof Baz
中没有参数),所以它说extends
子句为true,并将t
设置为unknown
另一方面,除非子类型元组的每个索引中的类型扩展了超类型元组中相应索引的值,否则元组类型不能真正相互扩展(即,[number&string,number]确实扩展了[number,number]
)。这意味着当存在不同数量的参数时,extends
子句总是返回false,并使第二个示例正常工作
这肯定很让人困惑,因此这里有一个。相关的TypeScript常见问题解答条目: