typescript - 为什么 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]
解决方案
推荐阅读
- jquery - 在更改的事件上向 Owl Carousel 项目添加类
- android - 图形 API 调试器错误 com.google.gapid.Server$GapisInitException
- oop - 业务规则领域建模
- r - 在 data.table 中矢量化 R for 循环
- c++ - 模板参数推导过程中会发生什么?
- vue.js - Vue.js 中的循环引用问题 - 但仅限于 CodeSandbox
- quarkus - 使用 h2 数据库运行具有持久性扩展的 Quarkus
- c# - Entity Framework Core 中的一对一关系
- qt - 如何在qt中多次使用单个QLineEdit来每次编辑不同的标签?
- c# - 如何从布尔值中获取 IEnumerable 枚举?