如何实现可将类型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
相关产品推荐
相关产品推荐

