TypeScript 模块和命名空间
TypeScript 提供了两种组织代码的方式:模块(Modules)和命名空间(Namespaces)。这两种机制帮助我们避免全局作用域污染,更好地组织和封装代码。
1. 模块 (Modules)
模块是 TypeScript 中组织和共享代码的主要方式。任何包含顶级 import
或 export
的文件都被视为一个模块。
导出 (Exporting)
// math.ts
export function add(x: number, y: number): number {
return x + y;
}
export const PI = 3.14159;
// 也可以在最后统一导出
// export { add, PI };
导入 (Importing)
// main.ts
import { add, PI } from './math';
console.log(add(2, 3));
console.log(PI);
// 或者导入所有内容
// import * as math from './math';
// console.log(math.add(2, 3));
默认导出
// greet.ts
export default function greet(name: string) {
console.log(`Hello, ${name}!`);
}
// main.ts
import greet from './greet';
greet('Alice');
2. 命名空间 (Namespaces)
命名空间是 TypeScript 特有的一种组织代码的方式,它可以将相关的代码组合在一起。
定义命名空间
// validation.ts
namespace Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return /^[A-Za-z]+$/.test(s);
}
}
}
// 使用
let lettersValidator = new Validation.LettersOnlyValidator();
console.log(lettersValidator.isAcceptable("Hello")); // 输出:true
跨文件的命名空间
命名空间可以跨多个文件,使用 ///
引用标签:
// otherValidators.ts
/// <reference path="validation.ts" />
namespace Validation {
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && /^[0-9]+$/.test(s);
}
}
}
3. 模块 vs 命名空间
- 模块是 ECMAScript 2015 (ES6) 的标准,是更现代的组织代码方式。
- 命名空间是 TypeScript 特有的,主要用于组织全局代码。
- 对于新项目,推荐使用模块而不是命名空间。
4. 模块解析
TypeScript 使用与 Node.js 类似的模块解析策略:
- 相对导入:
import { a } from "./moduleB"
- 非相对导入:
import { a } from "moduleB"
TypeScript 编译器有几种模块解析策略,如 Classic 和 Node。可以在 tsconfig.json
中配置:
{
"compilerOptions": {
"moduleResolution": "node"
}
}
5. 动态导入
TypeScript 3.8+ 支持动态导入:
async function getZipValidator() {
const validators = await import('./validators');
return new validators.ZipCodeValidator();
}
6. 模块扩增
可以扩展外部模块的类型定义:
// 假设 moment.d.ts 已经存在
declare module "moment" {
export function doSomething(): void;
}
这些是 TypeScript 中模块和命名空间的主要概念和用法。它们提供了强大的工具来组织和管理大型项目的代码结构。正确使用这些特性可以极大地提高代码的可维护性和可重用性。
抓紧学会吧哈哈哈哈?