定义泛型接口需在接口名后声明类型参数并统一约束,用&组合多重接口实现灵活约束,泛型还可限定行为(如可调用、可索引),类型别名适合轻量泛型组合。

定义复杂的泛型接口与类型约束,关键在于把“结构要求”和“组合能力”表达清楚——不是堆语法,而是让编译器能准确推导、检查和提示。
泛型接口要带参数,且约束放在接口层级
泛型接口的类型参数写在接口名后,而不是函数签名里。这样整个接口的行为都基于该参数,便于复用和统一约束。
- 正确写法:接口本身声明
<T>,后续所有成员都可使用T - 错误写法:在接口内部某个方法里单独写
<T>,会导致每个方法独立推断,失去一致性 - 示例:
interface Repository<T extends { id: number }> { findById(id: number): T | undefined; save(item: T): void; }
用接口组合实现多重约束
一个类型常需同时满足多个特征(比如既有 id,又有 name,还要可序列化),这时用 & 组合多个接口比嵌套 extends 更清晰、更灵活。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
interface Identifiable { id: number; }interface Named { name: string; }interface Timestamped { createdAt: Date; }- 组合使用:
function update<T extends Identifiable & Named & Timestamped>(item: T): T
约束不只是“有属性”,还能限定行为或结构
泛型约束可以是接口、类、甚至对象字面量类型,只要它能描述出你期望的“形状”。常见模式包括:
- 要求含可读属性:
T extends { length: number } - 要求可调用:
T extends (...args: any[]) => any - 要求可索引:
T extends Record<string, unknown> - 要求是构造函数:
T extends new (...args: any[]) => any
类型别名也能泛型化,适合简单组合场景
当不需要实例化、也不涉及方法定义时,泛型类型别名往往比接口更轻量,也更适合嵌套或条件类型配合使用。
type ApiResponse<T> = { data: T; success: boolean; error?: string; }type Paginated<T> = { items: T[]; total: number; page: number; }- 可叠加约束:
type SafeMap<K extends string | number, V> = Map<K, V>

















