TypeScript学习之路 - 模块和命名空间

TypeScript 模块和命名空间

TypeScript 提供了两种组织代码的方式:模块(Modules)和命名空间(Namespaces)。这两种机制帮助我们避免全局作用域污染,更好地组织和封装代码。

1. 模块 (Modules)

模块是 TypeScript 中组织和共享代码的主要方式。任何包含顶级 importexport 的文件都被视为一个模块。

导出 (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 中模块和命名空间的主要概念和用法。它们提供了强大的工具来组织和管理大型项目的代码结构。正确使用这些特性可以极大地提高代码的可维护性和可重用性。

抓紧学会吧哈哈哈哈?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳房子的前端

你的打赏能让我更有力地创造

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值