interface 接口(含继承与声明合并)
最后更新:2026-10-22
interface 接口(含继承与声明合并)
interface 用一个名字描述对象的结构:规定有哪些属性、方法以及各自的类型。它只存在于编译期(转译后完全消失),支持 extends 继承与同名声明合并,是与 type 别名并列的两大类型定义方式。
| 分组 | 类型组合 |
|---|---|
| 类型 | 语法 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
interface Animal {
name: string;
speak(): void;
}
// 继承
interface Pet extends Animal {
owner: string;
}
// 声明合并:同名 interface 自动合并成员
interface Window { title: string }
interface Window { version: number }
⚙️ 参数
| extends | 继承一个或多个接口,获得其全部成员 |
|---|---|
| ?: | 可选属性标记,允许该属性缺席 |
| readonly | 只读修饰符,赋值后不可再修改 |
返回值:无返回值——interface 是纯类型层概念,不产生任何运行时代码。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
Tom Jerry
Meow
(转译后运行输出;类型检查由 tsc 完成——把 name 改成数字会得到 error TS2322)
💡 要点
ℹ️ 说明 interface 转译后完全消失,零运行时开销;它只是给编译器看的"结构说明书"。
💡 提示 同名 interface 会自动合并(声明合并),这是扩展第三方库类型(如给 window 加自定义字段)的标准手法。
⚠️ 注意 interface 与 type 别名大部分场景可互换;需要联合/映射/条件等类型运算时只能用 type,需要声明合并时只能用 interface(教程第 9/11 课有完整对比表)。
🏷️ 相关类型组合
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q interface 和 type 有什么区别?
A 两者都定义对象结构,日常可互换。interface 支持 extends 与声明合并;type 能表达联合、元组、映射、条件类型等任意类型运算。团队约定二选一即可,混用要克制。
Q interface 能描述函数、数组或类吗?
A 可以:可调用签名((x: number): string)描述函数,索引签名([i: number]: T)描述数组,new 签名描述构造函数,类用 implements 实现接口。
Q 什么是声明合并?什么时候有用?
A 两个同名 interface 的成员会自动合并成一个。典型用途:给第三方库的 window、Request 等类型补自定义字段,而无需改库源码。