typescript 中 interface 可描述类实例形状、约束构造函数类型或被类实现,类通过 implements 显式满足接口契约,二者职责分离:interface 是纯类型检查工具,class 是运行时实体。

在 TypeScript 中,class 本身不能直接“定义接口”,但你可以用 interface 来描述 class 的公共形状(即实例类型),也可以让 class 实现(implements)接口,从而强制它具备某些属性或方法。这是 TypeScript 类型系统的核心协作方式。
用 interface 描述 class 实例的结构
接口可以精准刻画一个类创建出来的对象长什么样——有哪些属性、方法、类型是否可选或只读。
- 接口不关心 class 内部怎么实现,只约定“对外暴露什么”
- 声明时不用写
new或构造签名,直接按实例对象来写 - 例如:一个 Person 类的实例应有 name 和 age,且能调用 greet()
interface PersonLike {
name: string;
age: number;
greet(): void;
}
class Person {
constructor(public name: string, public age: number) {}
greet() {
console.log(`Hi, I'm ${this.name}`);
}
}
const p: PersonLike = new Person("Alice", 30); // ✅ 类型检查通过
让 class 实现 interface(implements)
这是更常见的用法:用 implements 显式声明“这个类承诺满足该接口的契约”。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 类必须提供接口中所有非可选成员的具体实现
- 接口中定义的方法,class 里必须有同名、兼容签名的方法体
- 支持一个类 implements 多个接口
interface Flyable {
fly(): void;
}
interface Swimmable {
swim(): void;
}
class Duck implements Flyable, Swimmable {
fly() { console.log("Flapping wings"); }
swim() { console.log("Paddling in water"); }
}
用 interface 描述 class 的构造函数类型(静态侧)
如果想约束“谁能被 new 起来”,就得用带 new() 签名的接口——它描述的是类的构造器本身,不是实例。
- 这种接口常用于工厂函数、依赖注入或抽象工厂模式
- 语法是
new (args): ReturnType
interface AnimalConstructor {
new (name: string): { name: string; makeSound(): void };
}
class Dog {
constructor(public name: string) {}
makeSound() { console.log("Woof!"); }
}
// ✅ Dog 类型符合 AnimalConstructor 接口(因为能 new Dog(...) 得到指定结构)
function createAnimal(ctor: AnimalConstructor, name: string) {
return new ctor(name);
}
const dog = createAnimal(Dog, "Buddy");
注意:interface 不继承 class,class 也不“变成” interface
接口和类职责不同:
-
interface是纯类型,编译后消失,只用于检查 -
class是运行时真实存在的值(有 prototype、可 new),同时也自带实例类型 - 你不需要为每个 class 都写对应 interface —— class 本身已隐式提供实例类型;只有当需要解耦、多态或跨模块契约时,才显式定义 interface
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










