面试题答案
一键面试使用TypeScript名字空间组织模块避免命名冲突
- 定义名字空间:在TypeScript中,可以使用
namespace
关键字来定义名字空间。例如,假设有两个功能模块,用户相关和订单相关,分别定义在不同名字空间:
namespace UserModule {
export class User {
constructor(public name: string) {}
public sayHello() {
console.log(`Hello, I'm ${this.name}`);
}
}
export function getUserInfo(user: User) {
return `User info: ${user.name}`;
}
}
namespace OrderModule {
export class Order {
constructor(public orderId: number) {}
public getOrderDetails() {
return `Order details with id ${this.orderId}`;
}
}
export function createOrder(order: Order) {
return `Order ${order.orderId} created`;
}
}
- 避免命名冲突:由于
UserModule
和OrderModule
是不同的名字空间,即使内部有相同命名的变量、函数或类,也不会产生冲突。比如,每个名字空间都可以有自己的User
类或getInfo
函数。
不同名字空间下相互调用函数或类
- 在同一个文件内调用:如果这些名字空间定义在同一个文件中,可以直接通过名字空间名访问。例如:
let user = new UserModule.User('John');
let userInfo = UserModule.getUserInfo(user);
console.log(userInfo);
let order = new OrderModule.Order(123);
let orderCreated = OrderModule.createOrder(order);
console.log(orderCreated);
- 在不同文件中调用:假设
UserModule
定义在userModule.ts
文件,OrderModule
定义在orderModule.ts
文件。userModule.ts
namespace UserModule {
export class User {
constructor(public name: string) {}
public sayHello() {
console.log(`Hello, I'm ${this.name}`);
}
}
export function getUserInfo(user: User) {
return `User info: ${user.name}`;
}
}
orderModule.ts
namespace OrderModule {
export class Order {
constructor(public orderId: number) {}
public getOrderDetails() {
return `Order details with id ${this.orderId}`;
}
}
export function createOrder(order: Order) {
return `Order ${order.orderId} created`;
}
}
- 调用文件(例如
main.ts
):需要先导入这些模块,在TypeScript中使用名字空间时,可以使用/// <reference>
指令。
/// <reference path="userModule.ts" />
/// <reference path="orderModule.ts" />
let user = new UserModule.User('Jane');
let userInfo = UserModule.getUserInfo(user);
console.log(userInfo);
let order = new OrderModule.Order(456);
let orderCreated = OrderModule.createOrder(order);
console.log(orderCreated);
注意:在现代TypeScript项目中,更推荐使用ES6模块(import
和export
),但名字空间在一些遗留项目或特定场景下仍有应用。