interface<T> 泛型接口

最后更新:2026-10-22

interface<T> 泛型接口

泛型接口在名字后挂类型参数(interface ApiResult<T>),把"容器形状"与"里面装什么"解耦:ApiResult<UserBrief> 与 ApiResult<number[]> 是同一套结构、不同的内容类型。接口、API 响应、存储结构都靠它复用。

分组泛型
类型语法
严格模式不需要

ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。

📝 语法

interface ApiResult<T> {
  code: number;
  data: T;
}

// 多个类型参数 + 默认值都支持
interface Paginated<T, Page = number> {
  page: Page;
  items: T[];
}

⚙️ 参数

<T>类型参数:使用时填具体类型(ApiResult<UserBrief>),也可由上下文推断
data: T内容字段与 T 联动:res1.data 自动是 UserBrief,读写都受检查

返回值:泛型接口是类型层概念,不产生运行时代码;实例化后的类型决定字段的读写类型。

▶ 示例

修改下面的代码,点击试一试查看转译运行结果:

输出:

Ada admin 20

(转译后运行输出;给 res1.data 塞数字或访问 res2.data.name 都会得到编译错误——T 已定型)

💡 要点

ℹ️ 说明 使用泛型接口时必须给类型参数(除非它有默认值):ApiResult 单独出现是"未实例化"状态,直接当变量类型用会报错。
💡 提示 嵌套场景直接组合:ApiResult<Paginated<Order>> 一层套一层,比手写 code/data/page/items 平铺结构更清晰。
⚠️ 注意 别为了泛型而泛型:接口只用一次且类型固定时,直接写具体类型更直白;泛型的价值在于同一形状复用于多种内容。
更多案例即将上线。

📚 相关教程

❓ 常见问题

Q 泛型接口和泛型 type 别名怎么选?
A 表达能力几乎等价。需要声明合并、extends 继承、类 implements 时用 interface;需要联合、映射、条件组合时用 type。
Q 接口方法上的泛型和接口本身的泛型有什么区别?
A interface Box<T> { open(): T } 的 T 在整个接口共用(同一个 Box<string> 实例所有 T 相同);interface Maker { make<T>(): T } 的 T 每次调用单独确定。前者"容器",后者"动作"。
Q 泛型接口能约束类型参数吗?
A 能,语法与函数相同:interface KeyedStore<T extends { id: string }> { get(id: string): T | undefined }——不满足约束的类型在使用处直接报错。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏