面试题答案
一键面试模块结构设计
- 按功能划分模块:将相关功能的代码组织到同一个模块中,比如用户相关功能放在
user
模块,订单相关功能放在order
模块。这样不同功能模块间接口同名概率降低。例如:
// user.module.ts
export interface User {
id: number;
name: string;
}
// order.module.ts
export interface Order {
id: number;
product: string;
}
- 使用命名空间:在模块内部,对接口进行命名空间划分。当接口逻辑上有分组需求时,这很有用。例如:
// utils.module.ts
export namespace MathUtils {
export interface Add {
(a: number, b: number): number;
}
export interface Subtract {
(a: number, b: number): number;
}
}
接口声明合并
- 谨慎使用全局接口:尽量避免在全局作用域声明接口,因为全局作用域下同名接口会自动合并,难以控制和维护。如果确实需要全局接口,要进行严格的命名规范,如使用项目名前缀。
- 明确模块内接口合并:在模块内,如果有同名接口合并需求,确保合并逻辑清晰。例如:
// animal.module.ts
export interface Animal {
name: string;
}
export interface Animal {
age: number;
}
// 合并后Animal接口有name和age属性
实际场景实现
假设我们正在开发一个电商系统,有商品模块和购物车模块。
- 商品模块:
// product.module.ts
export interface Product {
id: number;
name: string;
price: number;
}
- 购物车模块:
// cart.module.ts
export interface Product {
quantity: number;
}
// 这里Product接口与product.module.ts中的Product接口同名,但合并后会同时有id、name、price、quantity属性
// 为避免混淆,可在购物车模块使用更明确的命名,如CartProduct
export interface CartProduct extends Product {
quantity: number;
}
通过这种方式,既利用了接口合并的特性,又避免了命名冲突和不必要的合并错误,提高了代码的可维护性和扩展性。