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
相关产品推荐
相关产品推荐

