You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为接受可变数量特定模式元组的TypeScript函数定义类型

解决方案

你可以通过泛型+映射元组类型实现需求,不需要固定参数数量,也不需要用链式调用:

可变参数版本

function f<T extends string, U extends `${T}${T}`>(arg: [T, U]) {}

// g函数的类型定义
function g<T extends string[]>(...args: { [K in keyof T]: [T[K], `${T[K]}${T[K]}`] }) {}

// 测试
f(['a', 'aa']) // 校验通过
f(['a', 'ab']) // 符合预期抛出类型错误

g(
  ['a', 'aa'], // 校验通过
  ['b', 'bb'], // 校验通过
  ['c', 'ab']  // 触发编译错误,符合预期
)

单个数组参数版本

如果需要传入一个数组而非可变参数,只要调整参数定义即可,核心逻辑完全一致:

function g<T extends string[]>(args: { [K in keyof T]: [T[K], `${T[K]}${T[K]}`] }) {}

// 调用方式
g([
  ['a', 'aa'],
  ['b', 'bb'],
  ['c', 'ab'] // 同样触发编译错误
])

实现原理

这里的泛型T是由所有入参元组的第一个元素类型组成的数组,通过映射类型遍历T的每一个索引位置,对对应位置的入参元组添加约束:第二个元素必须是第一个元素重复两次的模板字符串类型,TypeScript会自动推导每个位置的类型并完成校验。

内容的提问来源于stack exchange,提问作者Natasha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:06:04