如何为链式调用中的嵌套函数参数实现动态类型检查?
实现带动态参数类型检查的链式调用
你的代码能正常运行链式逻辑,但因为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
相关产品推荐
相关产品推荐

