如何在TypeScript中为连续转换函数定义输入输出类型?
TypeScript 转换函数数组的类型约束方案
要实现这种链式转换函数数组的类型约束,核心是利用 TypeScript 的元组类型递归推导,让数组中每个函数的输入类型自动匹配前一个函数的输出类型,同时支持指定首尾类型。
核心类型定义
先定义通用类型 TransformChain,它接收一个类型元组(代表转换过程的类型节点),生成对应的函数数组类型:
// 将类型元组转换为匹配的函数数组类型 type TransformChain<Types extends any[]> = Types extends [infer First, ...infer Rest] ? Rest extends [infer Second, ...infer Tail] ? [(input: First) => Second, ...TransformChain<Rest>] : [] : [];
这个类型会递归遍历传入的类型元组,把每一组相邻类型转换为(前类型) => 后类型的函数类型,最终组成严格匹配的函数数组类型。
指定首尾类型的工具函数
如果需要用户指定第一个函数的输入类型和最后一个函数的输出类型,可以封装工具函数让 TypeScript 自动推导中间转换类型:
// 创建转换链的工具函数,约束函数输入输出匹配 function createTransformChain<Input, Output>( ...fns: TransformChain<[Input, ...any[], Output]> ) { return fns; }
使用示例
以string → number → boolean的转换链为例:
// 符合约束的合法转换链 const validChain = createTransformChain<string, boolean>( (str) => parseInt(str), // 输入string,输出number,匹配下一个函数的输入 (num) => num > 0, // 输入number,输出boolean,匹配指定的最终类型 ); // 错误示例:函数输出与后续输入不匹配时,TypeScript直接报错 const invalidChain = createTransformChain<string, boolean>( (str) => str.length, // 输出number,没问题 (num) => num.toString(), // 输出string,与最终boolean类型不匹配,触发报错 );
自动推导首尾类型的方案
如果不需要提前指定首尾类型,也可以让 TypeScript 自动推导整个转换链的类型:
// 自动校验转换链的类型 type AutoTransformChain<T extends ((input: any) => any)[]> = T extends [(input: infer I) => infer O, ...infer Rest] ? Rest extends ((input: O) => any)[] ? T : never : T; // 自动推导的工具函数 function autoTransformChain<T extends ((input: any) => any)[]>( ...fns: AutoTransformChain<T> ) { return fns; } // 使用示例:自动推导 string → number → boolean const autoChain = autoTransformChain( (str) => parseInt(str), (num) => num > 0, );
这种方式下,只要数组中某个函数的输入与前一个函数的输出不匹配,TypeScript 就会抛出类型错误,完全满足链式转换的类型约束需求。
内容的提问来源于stack exchange,提问作者geeko
相关产品推荐
相关产品推荐

