面试题答案
一键面试type合并规则
type
别名不能合并。一旦定义,它就是固定的类型描述,重复定义相同名称的type
会报错。例如:
type User = { name: string };
// 报错:标识符“User”重复。
type User = { age: number };
interface合并规则
- 属性合并:同名
interface
会自动合并其属性。如果有相同属性,后者的属性类型会覆盖前者,但前提是类型兼容。例如:
interface User {
name: string;
}
interface User {
age: number;
}
let user: User = { name: 'John', age: 30 };
- 方法合并:同名
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;
}
};
实际项目中使用场景及举例
- 模块扩展:在开发大型项目时,不同模块可能需要对同一个基础类型进行扩展。例如,在一个电商项目中,基础用户信息可能在用户模块定义:
// userModule.ts
interface User {
id: number;
name: string;
}
在订单模块,可能需要给用户信息添加地址信息:
// orderModule.ts
interface User {
address: string;
}
这样就可以在订单模块使用包含id
、name
和address
的完整User
类型。
- 插件化开发:当开发插件系统时,主应用定义一个基础接口,插件可以对其进行扩展。例如,主应用定义一个日志记录接口:
// mainApp.ts
interface Logger {
log(message: string): void;
}
某个插件希望增加记录错误信息的功能:
// plugin.ts
interface Logger {
error(message: string): void;
}
这样插件就可以使用扩展后的Logger
接口,实现更丰富的日志记录功能。