如何为内部类型一致、跨元组可变的二元组数组指定TypeScript类型?
二元组数组的TypeScript类型校验方案
一、基础需求:每个二元组内元素类型一致
需要为foo函数的args参数标注类型,确保每个二元组的两个元素类型完全匹配,不同二元组的类型可自由变化。
类型标注实现
function foo<T extends readonly [unknown, unknown][]>( args: { [K in keyof T]: T[K] extends [infer U, infer U] ? T[K] : never } ) { // 函数业务逻辑 }
正确调用示例
foo([ [1, 3], ["hello", "world"], [true, true], [2, 7] ]) // 无编译错误
错误调用示例
当二元组内元素类型不匹配时,会触发编译错误:
foo([ [1, 3], ["hello", 5], // 错误:string与number类型不匹配 [true, true], [2, 7n] // 错误:number与bigint类型不匹配 ])
二、进阶需求:适配[SomeType<T>, T]结构的二元组
要求每个二元组的第一个元素是带泛型参数T的SomeType类型,第二个元素的类型必须与该泛型参数T完全匹配,不同二元组的T可自由变化。
先定义SomeType类型
type SomeType<T> = { value: T };
类型标注实现
function foo<T extends readonly [SomeType<unknown>, unknown][]>( args: { [K in keyof T]: T[K] extends [SomeType<infer U>, infer U] ? T[K] : never } ) { // 函数业务逻辑 }
正确调用示例
foo([ [{ value: 1 }, 3], [{ value: "hello" }, "world"], [{ value: true }, true], [{ value: 2n }, 7n] ]) // 无编译错误
错误调用示例
当二元组内的泛型参数与第二个元素类型不匹配时,会触发编译错误:
foo([ [{ value: 1 }, 3], [{ value: "hello" }, 5], // 错误:SomeType<string>的泛型参数与number不匹配 [{ value: true }, true], [{ value: 2 }, 7n] // 错误:SomeType<number>的泛型参数与bigint不匹配 ])
内容的提问来源于stack exchange,提问作者Dennis Kats
相关产品推荐
相关产品推荐

