TypeScript多管道函数数组的泛型类型校验实现咨询
实现多组管道函数的TypeScript类型校验
核心类型定义
复用你已有的单组管道校验泛型Chain,再扩展出多组管道的约束类型:
// 校验单组管道的链式类型兼容性 type Chain<T extends any[]> = T extends [infer FirstFn, ...infer RestFns] ? FirstFn extends (...args: any[]) => infer Output ? RestFns extends ((input: Output) => any)[] ? [FirstFn, ...RestFns] : never : never : []; // 约束多组管道的配置结构:每个属性对应一组合规的管道 type MultiPipelineConfig = { [key: string]: Chain<any[]>; };
use函数实现
通过泛型约束,让use函数自动校验传入的多组管道:
function use<Pipelines extends MultiPipelineConfig>(pipelines: Pipelines) { // 这里可添加管道执行、存储等业务逻辑 return pipelines; }
示例演示
正确用法
每组管道内的函数输入输出完全匹配,TypeScript不会报错:
use({ before: [ (num: number) => num.toString(), (str: string) => str.length, (len: number) => len > 5 ], after: [ (isValid: boolean) => isValid ? "passed" : "failed", (status: string) => ({ code: 200, status }) ] });
错误用法
after管道中第二个函数的输入类型与前一个的输出不匹配,TypeScript会直接检测到错误:
use({ before: [ (num: number) => num.toString(), (str: string) => str.length ], after: [ (isValid: boolean) => isValid ? 1 : 0, (status: string) => ({ status }) // ❌ TypeScript报错:类型“number”的参数不能赋给类型“string”的参数 ] });
类型校验说明
Chain泛型会递归校验单组管道内的每个函数:确保前一个函数的输出类型,能完全匹配后一个函数的输入类型。MultiPipelineConfig将单组校验逻辑扩展到对象的所有属性,实现多组管道的批量校验。use函数通过泛型约束Pipelines extends MultiPipelineConfig,强制要求传入的所有管道组都符合链式类型兼容规则,不符合的代码会在编译阶段被TypeScript拦截。
内容的提问来源于stack exchange,提问作者HardCoreQual
相关产品推荐
相关产品推荐

