TypeScript中如何实现支持不同参数数量的可选参数泛型类型?
解决方案
核心实现思路
TypeScript 支持给泛型参数设置默认值,配合条件类型即可实现根据传入泛型的数量自动匹配对应函数签名的效果,从根本上解决「泛型类型需要N个类型参数」的报错。
完整实现代码
// 自定义类型示例,可替换为你实际的业务类型 type CustomType = { /* 你的自定义类型定义 */ }; // 泛型参数从后往前设置默认值为void,支持传入0、1、2个参数的场景 type SampelType<T1 = void, T2 = void> = T2 extends void ? T1 extends void // 无泛型参数:无入参函数 ? () => 0 | Promise<any> // 1个泛型参数:单入参函数 : (arg1: T1) => 0 | Promise<any> // 2个泛型参数:双入参函数 : (arg1: T1, arg2: T2) => 0 | Promise<any>
效果验证
完全符合你需要的调用写法,不会触发类型报错:
const caseOne: SampelType<number, CustomType>; caseOne(123, {} as CustomType); // 类型校验正常,入参类型严格匹配 const caseTwo: SampelType<string>; caseTwo("test"); // 类型校验正常,仅接受1个字符串入参 const caseThree: SampelType; caseThree(); // 类型校验正常,无入参
更简洁的扩展方案
如果不需要严格限制泛型的传参顺序和数量,想要支持任意数量的入参类型定义,可以用元组泛型结合剩余参数实现,代码更简洁扩展性更强:
type SampelType<T extends any[] = []> = (...args: T) => 0 | Promise<any> // 使用方式 const caseOne: SampelType<[number, CustomType]>; // 双参数 const caseTwo: SampelType<[string]>; // 单参数 const caseThree: SampelType; // 无参数
内容的提问来源于stack exchange,提问作者MaurMurry
相关产品推荐
相关产品推荐

