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

TypeScript中能否将<T extends Values>泛型约束提取为通用类型复用?

泛型约束复用的实现方法

当然可以复用这种T extends Values的泛型约束,但不能直接像你尝试的type GTest = T extends Values那样定义,得用TypeScript的泛型类型别名或泛型接口继承来实现。

方法一:泛型基接口继承

这是最直观的复用方式,先定义一个带约束的泛型基接口,其他接口直接继承它:

// 先定义基础的Values接口
interface Values {
  id: string;
  value: number;
}

// 定义带Values约束的泛型基接口
interface BaseWithValues<T extends Values> {}

// 复用约束定义接口A
interface A<T extends Values> extends BaseWithValues<T> {
  name: User<T>;
  errors: Errors;
}

// 复用约束定义接口B
interface B<T extends Values> extends BaseWithValues<T> {
  name: User2<T>;
  data: Data;
}

// 其他依赖类型示例
interface User<T extends Values> {
  username: string;
  info: T;
}

interface User2<T extends Values> {
  nickname: string;
  details: T;
}

type Errors = { [key: string]: string };
type Data = { content: string };

如果多个接口有公共字段,还可以把公共字段放在基接口里,进一步减少重复代码:

interface BaseWithValues<T extends Values> {
  // 公共字段示例
  updateTime: string;
  source: T;
}

interface A<T extends Values> extends BaseWithValues<T> {
  name: User<T>;
  errors: Errors;
}

interface B<T extends Values> extends BaseWithValues<T> {
  name: User2<T>;
  data: Data;
}

方法二:泛型类型别名约束

也可以定义一个泛型类型别名,用来封装T extends Values的约束逻辑,然后在接口中使用:

// 定义约束类型别名
type ValuesConstrained<T> = T extends Values ? T : never;

// 使用约束的接口A
interface A<T extends ValuesConstrained<T>> {
  name: User<T>;
  errors: Errors;
}

// 使用约束的接口B
interface B<T extends ValuesConstrained<T>> {
  name: User2<T>;
  data: Data;
}

这种方式更适合不需要继承公共字段的场景,本质是把约束逻辑封装成一个类型工具。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:25:39