You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:17:48