如何为带约束与默认值的泛型类型创建别名以复用?
复用重复泛型约束的可行方案
问题场景
我有多个泛型函数,它们使用相同的泛型类型——该类型受object约束且默认值为StringMap,示例代码如下:
function pepe<TInterpolationMap extends object = StringMap>(key: string, ownOptions: TOptions<TInterpolationMap> | string): string { /* code */ } function kaka<TInterpolationMap extends object = StringMap>(key: string, ownOptions: TOptions<TInterpolationMap> | string): string { /* code */ }
还有更多具有相同签名的函数。我尝试将泛型声明抽象为别名:
type boundedType<T> = <T extends object = StringMap>
想让函数声明简化为:
function pepe<boundedType<TInterpolationMap>>(key: string, ownOptions: TOptions<TInterpolationMap> | string): string { /* code */ } function kaka<boundedType<TInterpolationMap>>(key: string, ownOptions: TOptions<TInterpolationMap> | string): string { /* code */ }
希望减少重复代码,同时能在一处修改泛型的约束参数(即object和StringMap)。
解决方案
TypeScript不支持直接抽象泛型参数的声明语法(你尝试的boundedType<T>写法无法直接嵌入函数泛型参数列表),但有两种实用的替代方案:
方案1:使用泛型函数类型别名(完全复用签名)
先定义包含完整泛型约束和函数签名的类型别名,再让函数实现该类型,彻底消除重复:
// 定义通用的函数类型,集中管理泛型约束和签名 type I18nFunction = <TInterpolationMap extends object = StringMap>( key: string, ownOptions: TOptions<TInterpolationMap> | string ) => string; // 声明函数时直接复用该类型 const pepe: I18nFunction = (key, ownOptions) => { /* 函数逻辑 */ }; const kaka: I18nFunction = (key, ownOptions) => { /* 函数逻辑 */ };
后续要修改泛型约束、默认值或函数参数,只需要调整I18nFunction的定义即可。
方案2:复用泛型约束与默认值(灵活适配签名)
如果函数签名有细微差异,但泛型约束一致,可以单独定义泛型约束的别名:
// 集中定义泛型的约束和默认值 type InterpolationMap<T extends object = StringMap> = T; // 函数声明时直接使用该别名 function pepe<TInterpolationMap = InterpolationMap>( key: string, ownOptions: TOptions<TInterpolationMap> | string ): string { /* 函数逻辑 */ } function kaka<TInterpolationMap = InterpolationMap>( key: string, ownOptions: TOptions<TInterpolationMap> | string ): string { /* 函数逻辑 */ }
这种方式保留了函数签名的灵活性,同时实现了泛型约束的复用。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

