🔍 搜索词
"infer rest array type"
"infer rest array args"
"infer rest array tuple"
"spread argument array expression "
✅ 可可行性检查清单
- 这不会对现有的TypeScript/JavaScript代码造成破坏性的改变
- 这不会改变现有JavaScript代码的运行时行为
- 这可以在不根据表达式的类型生成不同的JS的情况下实现
- 这不是一个运行时特性(例如库功能、JavaScript输出的非ECMAScript语法、JS的新语法糖等)
- 这不是一个请求添加新实用类型的请求:https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- 这个特性将与我们的设计目标一致:https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
⭐ 建议
给定以下函数:
function foo (a: number, b: string, c: boolean) {}
TypeScript已经支持推断出用作rest参数的数组应该被视为元组:
foo (1, ...(["a", true])) // Works
但是,如果将其与一些条件混合在一起,类型推断就会中断:
const someCondition = true
foo (1, ...(someCondition ? ["a", true] : ['b', false])) // A spread argument must either have a tuple type or be passed to a rest parameter.(2556)
我的建议是添加对内联数组在复杂表达式中用作扩展参数的支持。
Playground链接
📃 激发性示例
我遇到这个问题时正在设计一个基于kysely的数据库无关模块。
我曾经这样写东西:
const myTableWithId =
dialect === 'pg'
? db.schema
.createTable('my_table')
.addColumn('id', 'bigserial', (col) => col.primaryKey())
: db.schema
.createTable('my_table')
.addColumn('id', 'bigint', (col) => col.autoIncrement().primaryKey())
await myTableWithId
.addColumn('my_col', 'varchar', (col) => col.notNullable())
.execute()
但这破坏了定义的线性风格。以下符号更自然:
await db.schema
.createTable('oauth_device')
.addColumn(
'id',
...(dialect === 'pg'
? ['bigserial', (col) => col.primaryKey()]
: ['bigint', (col) => col.autoIncrement().primaryKey()])
)
.addColumn('my_col', 'varchar', (col) => col.notNullable())
.execute()
它目前可以工作,但需要额外的类型转换(请参阅之前的playground链接)
💻 用例
- 你打算用这个做什么?能够编写更具可读性的代码
- 当前方法存在哪些缺点?过于冗长
- 在这段时间里,你正在使用什么解决方法?声明扩展元组的类型并将每个值转换为该类型
2条答案
按热度按时间gab6jxml1#
Some issues that are likely related in some ways:
#45600
#42508
#42037
2jcobegt2#
三元的具体案例似乎可以尝试添加。