首页 > 解决方案 > 为什么 Typescript 元组类型推断会这样工作?

问题描述

我需要在 Typescript 中进行正确的元组类型推断,并在官方 Typescript GitHub 中偶然发现了一个解决我的问题的神奇解决方案。

在以下代码段中,tuple3显然是建议的解决方案。我添加了一些没有导致预期结果的变化。

我的问题是:为什么会这样tuple3工作?我想联合类型就像一个独家选择一样工作。检查联合中的第一种类型是否适合,如果适合,请使用它,否则继续下一个。遵循这条规则,我希望编译器会发现 (for tuple3)[void]不适合推理的给定参数,因此它{}用作类型,导致与tuple4. 但显然 union ( [void] | {}) 中的类型以某种方式连接?这是功能还是错误?它是否记录在某处?

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]

标签: typescript

解决方案


推荐阅读