MST

星途 面试题库

面试题:TypeScript 中 type 和 interface 的合并行为及应用场景

说明在 TypeScript 里 type 和 interface 的合并规则分别是什么,在实际项目开发中,哪些场景下会用到它们的合并特性,举例说明。
25.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

type合并规则

type别名不能合并。一旦定义,它就是固定的类型描述,重复定义相同名称的type会报错。例如:

type User = { name: string };
// 报错:标识符“User”重复。
type User = { age: number }; 

interface合并规则

  1. 属性合并:同名interface会自动合并其属性。如果有相同属性,后者的属性类型会覆盖前者,但前提是类型兼容。例如:
interface User {
  name: string;
}
interface User {
  age: number;
}
let user: User = { name: 'John', age: 30 }; 
  1. 方法合并:同名interface中的同名方法签名会合并成一个方法签名,参数和返回值类型必须兼容。例如:
interface MathUtils {
  add(a: number, b: number): number;
}
interface MathUtils {
  add(a: number, b: number, c?: number): number;
}
let math: MathUtils = {
  add(a, b, c?) {
    return c? a + b + c : a + b;
  }
}; 

实际项目中使用场景及举例

  1. 模块扩展:在开发大型项目时,不同模块可能需要对同一个基础类型进行扩展。例如,在一个电商项目中,基础用户信息可能在用户模块定义:
// userModule.ts
interface User {
  id: number;
  name: string;
}

在订单模块,可能需要给用户信息添加地址信息:

// orderModule.ts
interface User {
  address: string;
}

这样就可以在订单模块使用包含idnameaddress的完整User类型。

  1. 插件化开发:当开发插件系统时,主应用定义一个基础接口,插件可以对其进行扩展。例如,主应用定义一个日志记录接口:
// mainApp.ts
interface Logger {
  log(message: string): void;
}

某个插件希望增加记录错误信息的功能:

// plugin.ts
interface Logger {
  error(message: string): void;
}

这样插件就可以使用扩展后的Logger接口,实现更丰富的日志记录功能。