TS 入门(七):TypeScript模块与命名空间

前言

在前几章中,我们学习了 TypeScript 的基础知识、函数与对象类型、接口与类、以及泛型编程。在本章中,我们将深入探讨 TypeScript 中的模块与命名空间。模块和命名空间是组织代码的两种主要方式,它们有助于代码的模块化和重用性。

回顾泛型编程

在上一章中,我们学习了以下内容:

  • 泛型函数
  • 泛型接口
  • 泛型类
  • 泛型约束
  • 多重类型参数与默认类型

在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


1. 模块

模块是 TypeScript 和 JavaScript 的基本构建块之一,用于组织代码。每个模块都有自己的作用域,不会与其他模块的变量发生冲突。

a. 导入和导出

使用 export 关键字将模块中的变量、函数或类导出,以便在其他模块中使用。

// math.ts
export function add(x: number, y: number): number {
  return x + y;
}

export const PI = 3.14;

// main.ts
import { add, PI } from './math';

console.log(add(5, 10)); // 15
console.log(PI); // 3.14

b. 默认导出

使用 export default 关键字可以导出一个默认值,每个模块只能有一个默认导出。

// person.ts
export default class Person {
  name: string;
  
  constructor(name: string) {
    this.name = name;
  }

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

// main.ts
import Person from './person';

let person = new Person("Alice");
person.greet(); // "Hello, my name is Alice"

c. 重命名导入和导出

在导入和导出时,可以使用 as 关键字进行重命名。

// math.ts
export function subtract(x: number, y: number): number {
  return x - y;
}

// main.ts
import { subtract as sub } from './math';

console.log(sub(10, 5)); // 5

2. 命名空间

命名空间用于组织代码,可以将相关的代码放在一个命名空间中,以避免全局作用域中的命名冲突。

a. 定义命名空间

使用 namespace 关键字定义命名空间,并将相关的代码放入其中。

namespace Geometry {
  export function areaOfCircle(radius: number): number {
    return Math.PI * radius * radius;
  }

  export function areaOfRectangle(width: number, height: number): number {
    return width * height;
  }
}

console.log(Geometry.areaOfCircle(5)); // 78.53981633974483
console.log(Geometry.areaOfRectangle(10, 20)); // 200

b. 嵌套命名空间

命名空间可以嵌套使用,以进一步组织代码。

namespace Animals {
  export namespace Mammals {
    export class Dog {
      bark() {
        console.log("Woof!");
      }
    }
  }

  export namespace Birds {
    export class Sparrow {
      chirp() {
        console.log("Chirp!");
      }
    }
  }
}

let dog = new Animals.Mammals.Dog();
dog.bark(); // "Woof!"

let sparrow = new Animals.Birds.Sparrow();
sparrow.chirp(); // "Chirp!"

3. 动态导入与条件导入

a. 动态导入

使用 import() 语法可以动态导入模块,这在需要按需加载模块时非常有用。

// main.ts
function loadModule(moduleName: string) {
  import(`./${moduleName}`).then(module => {
    console.log(module);
  }).catch(err => {
    console.error("Failed to load module", err);
  });
}

loadModule('math');

b. 条件导入

可以根据条件有选择地导入模块。

// main.ts
let isMathModuleNeeded = true;

if (isMathModuleNeeded) {
  import('./math').then(module => {
    console.log(module.add(5, 10)); // 15
  });
} else {
  console.log("Math module is not needed.");
}

结语

通过本章的学习,你应该对 TypeScript 中的模块与命名空间有了更深入的理解。掌握这些内容将使你能够更加有效地组织和管理代码。在下一章中,我们将继续探讨 TypeScript 中的装饰器与高级类型操控,包括类装饰器、方法装饰器、访问器装饰器、属性装饰器、参数装饰器、类型别名、映射类型、条件类型和工具类型等内容。务必掌握好每个概念,它们将为你后续学习 TypeScript 提供坚实的基础。

相关推荐

  1. typescript 命名空间、装饰器

    2024-07-17 21:28:05       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 21:28:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 21:28:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 21:28:05       57 阅读
  4. Python语言-面向对象

    2024-07-17 21:28:05       68 阅读

热门阅读

  1. linux service小例

    2024-07-17 21:28:05       19 阅读
  2. 正则表达式

    2024-07-17 21:28:05       21 阅读
  3. 笔记:运行时动态更改Ioc服务的实现

    2024-07-17 21:28:05       22 阅读
  4. 力扣—最大连续1的个数 III

    2024-07-17 21:28:05       21 阅读
  5. Netty HTTP

    2024-07-17 21:28:05       16 阅读
  6. 后仿综述 Gate Level Simulation: A Comprehensive Overview

    2024-07-17 21:28:05       18 阅读
  7. Spring中事务是如何实现的?

    2024-07-17 21:28:05       20 阅读
  8. [C++11] 模板函数的默认模板参数

    2024-07-17 21:28:05       17 阅读
  9. python-Web

    2024-07-17 21:28:05       20 阅读
  10. 企业和个人在网络安全方面需承担哪些责任?

    2024-07-17 21:28:05       18 阅读