我需要在Typescript中进行适当的元组类型推断,偶然发现a magic solution for my problem in the official Typescript GitHub。
在以下代码段中,tuple3
显然是建议的解决方案。我添加了一些不会导致预期结果的变化。
我的问题是:为什么 tuple3
的工作方式如何?我想联盟类型就像独家选择一样。检查,如果联合中的第一个类型适合,如果是,则使用它,否则继续下一个。遵循这条规则,我希望编译器发现(对于tuple3
)[void]
不适合推理的给定参数,因此它使用{}
作为类型,导致相同结果为tuple4
。但显然联盟中的类型([void] | {}
)是以某种方式连接的?这是一个功能还是一个bug?它是在某处记录的吗?
function tuple1<TupleT>(tuple: TupleT): TupleT
{ return tuple; }
tuple1([42, 'foo', true]); // type: (string | number | boolean)[]
function tuple2<TupleT extends [void]>(tuple: TupleT): TupleT
{ return tuple; }
tuple2([42, 'foo', true]); // error: [number, string, boolean] not assignable to [void]
function tuple3<TupleT extends [void] | {}>(tuple: TupleT): TupleT
{ return tuple; }
tuple3([42, 'foo', true]); // type: [number, string, boolean]
function tuple4<TupleT extends {}>(tuple: TupleT): TupleT
{ return tuple; }
tuple4([42, 'foo', true]); // type: (string | number | boolean)[]
function tuple5<TupleT extends [any]>(tuple: TupleT): TupleT
{ return tuple; }
tuple5([42, 'foo', true]); // error: [number, string, boolean] not assignable to [any]