为什么Typescript Tuple Type Inference这样工作?

时间:2018-05-16 09:23:33

标签: typescript

我需要在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]

0 个答案:

没有答案