TypeScript 当在复杂表达式中将数组作为剩余参数使用时,将其推断为元组,

kqlmhetl  于 6个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(49)

🔍 搜索词

"infer rest array type"
"infer rest array args"
"infer rest array tuple"
"spread argument array expression "

✅ 可可行性检查清单

⭐ 建议

给定以下函数:

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链接)

💻 用例

  1. 你打算用这个做什么?能够编写更具可读性的代码
  2. 当前方法存在哪些缺点?过于冗长
  3. 在这段时间里,你正在使用什么解决方法?声明扩展元组的类型并将每个值转换为该类型
gab6jxml

gab6jxml1#

Some issues that are likely related in some ways:
#45600
#42508
#42037

2jcobegt

2jcobegt2#

三元的具体案例似乎可以尝试添加。

相关问题