TypeScript多组Tuple参数与回调的类型推断优化方案问询
TypeScript多组条件参数函数的类型优化问题
基础实现(已正常工作)
先完成了单组参数的函数:第一个参数为元组,第二个回调函数的参数为该元组的非空元素,类型推断正常:
let first: number | null | undefined; let last: number | null | undefined; let before: Date | null | undefined; let after: Date | null | undefined; type NonNullableArray<T extends any[]> = { [K in keyof T]: NonNullable<T[K]> }; function iff<T extends any[]>(...arr: [T, (...args: NonNullableArray<T>) => any]): void {} iff([first, last], (first, last) => null); // 此处(first, last)类型为(number, number),推断正确
多组参数的需求与现有实现缺陷
现在需要实现支持多组此类参数的函数(暂时简化去掉非空处理),当前尝试的实现如下:
type ArrayKeys<A extends any[]> = Exclude<keyof A, keyof []>; function multipleIfs< A extends any[] & { [k in ArrayKeys<A>]: [A[k][0], (args: A[k][0]) => any]; } >(arg: A): void {}
测试用例暴露的问题
- 自动推断失效:回调参数无法从元组自动推断类型,默认变为
any
multipleIfs([ [[first, last], ([first, last]) => null], // (first, last)类型为(any, any),推断失败 [[after, before], ([after, before]) => null], // 同上 ]);
- 类型校验不严格:部分参数不匹配的错误用例未被拦截
multipleIfs([ // 逻辑上应该被禁止,但当前实现未报错 [[first, last], (arg: [typeof after, typeof before]) => null], [[after, before], (arg: [typeof first, typeof before]) => null], ]);
- 需手动指定泛型:只有显式声明泛型参数,才能得到正确的类型推断
multipleIfs<A>([ // 必须手动提示类型才能正常推断 [[first, last], ([first, last]) => null], [[after, before], ([after, before]) => null], ]);
固定长度方案(不想要的实现)
目前能正常工作的是固定长度的版本,但这种方案限制了参数组数的灵活性,无法动态适配任意多组参数:
type Tuple = readonly any[]; type IffArgs<T extends Tuple> = [T, (...args: NonNullableArray<T>) => any]; function multipleIfs3< T0 extends Tuple, T1 extends Tuple, T2 extends Tuple, T3 extends Tuple, T4 extends Tuple, T5 extends Tuple, T6 extends Tuple, T7 extends Tuple, T8 extends Tuple, T9 extends Tuple >( ...arr: [ IffArgs<T0>, IffArgs<T1>?, IffArgs<T2>?, IffArgs<T3>?, IffArgs<T4>?, IffArgs<T5>?, IffArgs<T6>?, IffArgs<T7>?, IffArgs<T8>?, IffArgs<T9>?, never? ] ): void {} multipleIfs3([[first, last], (first, last) => null], [[after, before], (after, before) => null]); // 此处类型推断正确
希望找到更灵活的优化方案:不需要限制参数组数,同时能自动正确推断回调参数类型,并严格校验每组参数的匹配关系。
内容的提问来源于stack exchange,提问作者darkbasic
相关产品推荐
相关产品推荐

