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

如何为带约束与默认值的泛型类型创建别名以复用?

复用重复泛型约束的可行方案

问题场景

我有多个泛型函数,它们使用相同的泛型类型——该类型受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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:58:24