MST
星途 面试题库

面试题:TypeScript中接口(Interface)和类型别名(Type Alias)的差异

请阐述在TypeScript里接口(Interface)和类型别名(Type Alias)在定义方式、功能特性及使用场景上有哪些不同点。
19.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

定义方式

  • 接口(Interface):使用 interface 关键字定义,以大括号包裹成员定义。例如:
interface User {
  name: string;
  age: number;
}
  • 类型别名(Type Alias):使用 type 关键字定义,等号后面跟类型描述。例如:
type User = {
  name: string;
  age: number;
};

功能特性

  • 接口(Interface)
    • 主要用于定义对象的形状,可重复声明,编译器会将重复声明合并。例如:
interface User {
  name: string;
}
interface User {
  age: number;
}
// 此时User接口同时有name和age属性
  • 支持继承,可以通过 extends 关键字继承其他接口,复用已有接口的属性和方法。例如:
interface Person {
  name: string;
}
interface Employee extends Person {
  employeeId: number;
}
  • 类型别名(Type Alias)
    • 不仅可以定义对象类型,还能定义基本类型、联合类型、交叉类型等。例如:
// 基本类型别名
type MyString = string;
// 联合类型别名
type StringOrNumber = string | number;
// 交叉类型别名
type Admin = { name: string } & { role: string };
  • 不支持重复声明,若重复声明相同名称的类型别名会报错。
  • 类型别名可以通过 & 实现类似接口继承的效果,用于创建交叉类型。例如:
type Person = {
  name: string;
};
type Employee = Person & {
  employeeId: number;
};

使用场景

  • 接口(Interface)
    • 当专注于定义对象的公共形状,特别是在面向对象编程风格中,适合使用接口。例如定义类的公共属性和方法,或定义函数参数和返回值的对象结构。
    • 在代码库中,如果需要多个地方复用对象结构,且可能需要逐步扩展该结构时,接口更为合适,因为其可重复声明和合并的特性。
  • 类型别名(Type Alias)
    • 当需要定义复杂类型,如联合类型、交叉类型,或者为基本类型创建别名以提高代码可读性时,类型别名更合适。
    • 在函数式编程风格中,类型别名常用来定义函数参数和返回值的复杂类型,因为它能表达更灵活的类型组合。