TypeScript中如何实现带泛型约束的函数组合flow函数?
代码修正方案
原实现的核心问题
- 执行逻辑时序错误:
flow的设计目标是接收两个函数、返回一个等待外部输入的组合函数,但原代码在flow被调用的阶段就直接执行了fab和fbc,完全没有等到后续组合函数接收到输入值再触发计算 - 参数缺失违反类型约束:原代码中空参数调用
fab()的写法,在编译阶段就会触发类型报错——fab的类型定义明确要求必须传入1个类型为A的入参,不传值不符合函数签名要求 - 没有匹配返回值类型:
Flow类型约定flow要返回一个接收类型A参数的函数,但原代码直接返回了fbc的执行结果(类型为C),返回值类型和约定的函数签名完全不匹配
修正后的完整可运行代码
type Flow = <A, B, C>( fab: (a: A) => B, fbc: (b: B) => C ) => (a: A) => C; export const flow: Flow = (fab, fbc) => { // 返回待调用的组合函数,接收类型为A的输入 return (input: A) => { // 按顺序执行函数链:先对入参应用fab,拿到类型B的中间值 const middleValue = fab(input); // 将中间值传入fbc,返回最终类型为C的计算结果 return fbc(middleValue); }; };
补充说明
- 类型推导规则:
Flow类型里定义的三个泛型A/B/C会自动帮你做类型校验——只要fab的返回值和fbc的入参能匹配上同一个B类型,TypeScript就会自动推导全链路的类型关系,不需要手动写额外的类型判断 - 代码精简写法:如果不需要显式的中间变量存值,函数体可以简化为一行:
这个写法和展开版的执行逻辑、类型约束完全一致,泛型会自动推导export const flow: Flow = (fab, fbc) => (input) => fbc(fab(input));input的类型为A
内容的提问来源于stack exchange,提问作者Anna Harshyna
相关产品推荐
相关产品推荐

