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

如何实现可将类型T传入泛型G<>得到G<T>的通用泛型类型?

是否存在通用方式实现接收泛型构造器和类型参数的泛型类型?

问题描述

想要实现一个通用泛型类型Transform<G, T>,其中G是泛型类型(比如Array、Promise),T是具体类型参数,最终输出G<T>的结果——比如让Transform<Array, string>得到string[],Transform<Promise, string>得到Promise<string>。

为什么目标写法无法运行

你尝试的这段JSDoc代码无法正常工作:

/**
 * @template G, T
 * @typedef {G<T>} Transform<G,T>
 */

/** 
 * @typedef {Transform<Array, string>} StringArray
 * @typedef {Transform<Promise, string>} StringPromise
 */

核心原因是:JSDoc的类型系统不支持将模板参数G当作「高阶泛型类型」直接调用G<T>。这里的G会被解析为普通类型,而非可接收类型参数的泛型构造器,因此该语法不被认可。

功能受限的可行实现

目前在JSDoc环境下,只能通过预先枚举需要支持的泛型类型,用条件判断来实现类型映射:

/**
 * @template G, T
 * @typedef {G extends Promise ? Promise<T> : G extends Array ? Array<T> : unknown } Transform<G,T>
 */

/** 
 * @typedef {Transform<Array, string>} StringArray  // 等价于 string[]
 * @typedef {Transform<Promise, string>} StringPromise  // 等价于 Promise<string>
 */

这种方式能覆盖特定场景需求,但缺点很明显:每当需要新增支持的泛型类型时,必须修改Transform的条件判断逻辑,无法做到真正的通用。

补充说明

如果是使用TypeScript而非纯JSDoc,可通过高阶类型实现真正的通用转换:

type Transform<G extends <U>() => U, T> = ReturnType<G<T>>;

type StringArray = Transform<typeof Array, string>; // string[]
type StringPromise = Transform<typeof Promise, string>; // Promise<string>

但该方案仅适用于TypeScript环境,纯JSDoc目前没有原生支持高阶泛型类型的语法。

内容的提问来源于stack exchange,提问作者Khaled

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:35:25