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

如何为链式调用中的嵌套函数参数实现动态类型检查?

实现带动态参数类型检查的链式调用

你的代码能正常运行链式逻辑,但因为Chain<T, U>类型里统一用了(...args: any),导致TypeScript无法推导出每个链式方法的具体参数类型,自然没法做参数校验。下面是修改后的解决方案,能让每个方法的参数类型严格对应原函数的定义:

// 重新定义Chain类型:映射U的每个键,提取对应函数的参数类型
type Chain<T, U> = { value: T } & {
  [K in keyof U]: U[K] extends (value: T) => (...args: infer Args) => T
    ? (...args: Args) => Chain<T, U>
    : never;
};

const createChain = <T, U extends Record<string, (value: T) => (...args: any) => T>>(
  funcs: U
) => (value: T): Chain<T, U> => {
  const chainMethods = Object.keys(funcs).reduce((acc, funcName) => {
    const key = funcName as keyof U;
    acc[key] = (...args: any) => {
      const updatedValue = funcs[key](value)(...args);
      return createChain(funcs)(updatedValue);
    };
    return acc;
  }, {} as Omit<Chain<T, U>, 'value'>);

  return { value, ...chainMethods };
};

// 原函数保持不变
const add = (value: number) => (num: number, isGood: boolean) => value + num;
const minus = (value: number) => (num: number) => value - num;

const data = 100;
const chain = createChain({ add, minus });
const dataWithChain = chain(data);

dataWithChain.add(12, false); // ✅ 类型正确,无报错
dataWithChain.minus(12); // ✅ 类型正确,无报错
dataWithChain.add(12); // ❌ 类型报错:缺少第二个参数isGood
dataWithChain.minus(12, "test"); // ❌ 类型报错:第二个参数应为number类型

关键修改说明:

  • Chain类型的映射改造:通过[K in keyof U]遍历每个方法名,用条件类型infer Args提取原函数的参数列表,让每个链式方法的参数类型和原函数完全一致
  • createChain的泛型约束优化:明确U是Record<string, (value: T) => (...args: any) => T>类型,确保传入的每个函数都符合「接收当前值T → 返回带参数的函数 → 返回新的T」的结构
  • 类型推导的准确性:修改后TypeScript能准确识别每个链式方法的参数数量、类型,错误调用会直接在IDE中给出提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:27:40