MST

星途 面试题库

面试题:TypeScript 中接口和类型别名的主要区别

请详细阐述在 TypeScript 里接口(interface)和类型别名(type alias)在定义方式、功能特性以及使用场景上的主要区别。
28.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

定义方式

  • 接口(interface):使用 interface 关键字定义。例如:
interface User {
  name: string;
  age: number;
}
  • 类型别名(type alias):使用 type 关键字定义。例如:
type UserType = {
  name: string;
  age: number;
};

功能特性

  • 接口(interface)
    • 可以重复声明,声明会自动合并。例如:
interface User {
  name: string;
}
interface User {
  age: number;
}
// User 接口现在有 name 和 age 属性
  • 主要用于定义对象的形状(shape),对类有更强的约束,类可以实现接口。例如:
interface Animal {
  speak(): void;
}
class Dog implements Animal {
  speak() {
    console.log('Woof!');
  }
}
  • 类型别名(type alias)
    • 不能重复声明,否则会报错。
    • 功能更通用,可以用于定义基本类型、联合类型、交叉类型等。例如:
// 定义联合类型
type StringOrNumber = string | number;
// 定义交叉类型
type Admin = { role: 'admin' } & UserType;

使用场景

  • 接口(interface)
    • 当你专注于定义对象的结构,特别是在面向对象编程中,类需要实现特定的契约时,接口是很好的选择。比如定义 API 数据的形状,或者定义类应该遵循的规范。
    • 团队中习惯使用接口来描述对象结构,以保持代码风格的一致性。
  • 类型别名(type alias)
    • 当需要定义更复杂的类型,如联合类型、交叉类型时,类型别名更为方便。
    • 对于基本类型的别名定义,类型别名也很适用,能提高代码的可读性,例如给特定含义的数字类型定义别名。