TypeScript泛型别名与嵌套函数类型转换问题咨询
TypeScript泛型相关问题解答
1. 是否可以为特定类型的泛型创建别名?
当然可以!TypeScript的类型别名完全支持泛型,而且你可以通过泛型约束来限定它只作用于特定类型的泛型参数。
举几个实用的例子:
- 提取数组的元素类型(仅针对数组类型):
type ArrayElement<T extends Array<any>> = T[number]; // 使用示例 type StringArrayElements = ArrayElement<string[]>; // 结果为 string type NumberArrayElements = ArrayElement<number[]>; // 结果为 number
- 提取Promise的resolve值类型(仅针对Promise类型):
type PromiseResolveType<T extends Promise<any>> = T extends Promise<infer U> ? U : never; // 使用示例 type AsyncNumberResult = PromiseResolveType<Promise<number>>; // 结果为 number type AsyncUserResult = PromiseResolveType<Promise<{ id: number; name: string }>>; // 结果为 { id: number; name: string }
你可以根据需求,给泛型别名添加任意的约束条件,让它只处理你关心的特定类型。
2. 如何定义递归处理嵌套对象中函数签名的泛型类型?
你的核心需求是递归遍历对象(包括嵌套对象),将所有柯里化的两层函数((a) => (b) => R)转换为单层函数((a) => R)。问题出在你之前的实现没有区分对象和函数类型,也没有做递归处理。
我们可以通过递归泛型类型来解决这个问题,分两步实现:
第一步:定义单个函数的转换逻辑
先写一个类型,专门处理柯里化的两层函数,把它转换成单层:
// 把两层柯里化函数 (Args) => (...) => FinalReturn 转换为 (Args) => FinalReturn type ConvertFunction<F extends (...args: any) => any> = F extends (...args: infer Args) => (...args: any) => infer FinalReturn ? (...args: Args) => FinalReturn : F; // 如果不是两层柯里化函数,保持原函数类型不变
第二步:递归处理对象(包括嵌套对象)
再写一个递归类型,遍历对象的每个属性:如果属性是函数,就用上面的ConvertFunction转换;如果是对象,就递归处理该对象的属性;基本类型则保持原样:
type Convertor<T> = T extends (...args: any) => any ? ConvertFunction<T> : T extends object ? { [P in keyof T]: Convertor<T[P]> } : T;
测试示例
用你给出的输入类型测试:
// 输入类型 type InputType = { foo: (a: number) => (b: string) => { id: number }, nested: { bar: (a: boolean) => (b: number) => { name: string } } }; // 转换后的类型 type OutputType = Convertor<InputType>;
OutputType最终会被解析为:
{ foo: (a: number) => { id: number }, nested: { bar: (a: boolean) => { name: string } } }
完美符合你的需求!这个实现的关键是通过递归遍历对象的所有层级,确保嵌套对象里的函数也能被正确转换。
内容的提问来源于stack exchange,提问作者Highmastdon
相关产品推荐
相关产品推荐

