type Person = { name: string age: number } interface Person { name: string age: number }显然,类型和接口的语法相似,关键区别在于类型使用 = 定义对象的形状,而接口则没有。不过,事情远不止这些。
// 可扩展性示例 interface Person extends Job { name: string age: number } interface Job { job: string } // 堆代码 duidaima.com // 使用 Person 和 Job 的属性。 const person: Person = { name: "John", age: 25, job: "全栈 Web 开发者", }在这里,Person 接口扩展了 Job,因此 Job 接口的属性合并到 Person 中。另一方面,类型也可以通过使用联合(|)或交叉(&)操作符来扩展现有类型。
// ✅ 可以正常工作 type Person = { name: string age: number } & { job: string } // ❌ 不可以正常工作 interface Person { name: string age: number } & { job: string }实现
// 实现示例 interface Work { doWork: () => void } class Person implements Work { name: string age: number constructor(name: string, age: number) { this.name = name this.age = age } // 实现 doWork 方法以满足 Work 接口。 doWork() { console.log("Working...") } } const person = new Person("John", 25) person.doWork()因此,如果你经常使用 OOP,接口将比类型更适用,因为类型不能直接由类实现。
// 初始 Person 接口 interface Person { name: string age: number } // 使用“声明合并”精炼 Person 接口 interface Person { gender: string } // 使用“合并”的接口定义一个新“person” const person: Person = { name: "John", age: 25, gender: "Male" }
一方面,这个特性允许方便地精炼和扩展现有接口,而不需要更改其他依赖项。以下是我重新声明 @auth/core/types 模块并精炼 Session 接口的示例。
2.与类的不安全合并:由于 TypeScript 编译器不检查属性初始化,这可能会导致意外的运行时错误。类型没有这个问题,因此更简单、更安全。