 闽公网安备 35020302035485号
                
                闽公网安备 35020302035485号
                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 编译器不检查属性初始化,这可能会导致意外的运行时错误。类型没有这个问题,因此更简单、更安全。