MST

星途 面试题库

面试题:TypeScript类型声明文件中接口与类型别名的区别

在TypeScript的类型声明文件(.d.ts)中,接口(interface)和类型别名(type alias)都可用于定义类型。请详细阐述它们之间的主要区别,包括但不限于声明方式、扩展方式以及使用场景。
47.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

声明方式

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

类型别名还可以用于其他类型,如联合类型、交叉类型等。例如:

type StringOrNumber = string | number;
type UserInfo = { name: string } & { age: number };

扩展方式

  • 接口(interface):通过 extends 关键字扩展。例如:
interface Employee extends User {
  jobTitle: string;
}

接口可以多继承,即一个接口可以继承多个接口。例如:

interface A { a: string; }
interface B { b: number; }
interface C extends A, B { c: boolean; }
  • 类型别名(type alias):对于对象类型,使用交叉类型 & 来实现类似扩展效果。例如:
type Employee = User & {
  jobTitle: string;
};

但类型别名不能像接口那样多继承,交叉类型组合多个类型时,若有同名属性且类型不一致会报错。

使用场景

  • 接口(interface)
    • 主要用于定义对象的形状,在面向对象编程风格中,当需要描述类的公共结构,或者定义可重用的对象类型结构时很有用,比如定义 API 数据返回格式。
    • 当需要对同一个接口进行多次声明合并时,接口更合适。例如:
interface User {
  name: string;
}
interface User {
  age: number;
}
// 此时 User 接口有 name 和 age 属性
  • 类型别名(type alias)
    • 适用于定义联合类型、交叉类型以及对原始类型进行别名定义。比如定义函数参数可能接受多种类型时使用联合类型别名很方便。
    • 对于一些复杂类型,特别是涉及到函数类型的别名定义,类型别名更为简洁。例如:
type CompareFunction = (a: number, b: number) => number;