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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:43:16