MST

星途 面试题库

面试题:TypeScript类型别名与接口在处理联合类型和交叉类型时的应用对比

假设你要定义一个类型,它可以表示一个字符串或者一个包含数字属性的对象,同时也需要支持扩展为既包含字符串属性又包含数字属性的对象。请分别使用类型别名和接口实现,并说明在这种场景下选择类型别名或接口的理由,以及它们在处理联合类型和交叉类型时的不同表现。
40.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

使用类型别名实现

type StringOrNumberObj = string | { [key: string]: number };
type ExtendedType = StringOrNumberObj & { [key: string]: string };

使用接口实现

interface NumberObj {
    [key: string]: number;
}
interface StringAndNumberObj extends NumberObj {
    [key: string]: string;
}
type StringOrNumberObj = string | NumberObj;

选择类型别名或接口的理由

  • 类型别名:更灵活,适用于各种类型定义,包括联合类型、交叉类型等复杂情况。在这里定义联合类型很方便。
  • 接口:主要用于定义对象类型结构,在面向对象编程中更强调对象的契约。这里使用接口可以更清晰地表达对象的结构继承关系。

联合类型和交叉类型的不同表现

  • 联合类型
    • 类型别名:使用 | 符号直接定义,如 string | { [key: string]: number },表示该类型的值可以是字符串,也可以是符合指定结构的对象。
    • 接口:接口本身不能直接定义联合类型,但可以通过类型别名来间接实现接口的联合,如 type StringOrNumberObj = string | NumberObj;,这里 NumberObj 是接口。
  • 交叉类型
    • 类型别名:使用 & 符号定义,如 StringOrNumberObj & { [key: string]: string },表示该类型的值需要同时满足 StringOrNumberObj{ [key: string]: string } 的要求。
    • 接口:接口通过 extends 关键字实现类似交叉类型的效果,如 interface StringAndNumberObj extends NumberObj { [key: string]: string; }StringAndNumberObj 继承了 NumberObj 的属性,同时增加了新的字符串属性要求。