【TypeScript】模块&命名空间

2021/09/09 09:36:33

摘要

  1. as 关键字用来进行导入/导出模块的重命名。
  2. * 来导入/导出一个模块的所有内容。
  3. * 重命名可将整个模块导入/导出到一个变量。

导出

// 任何声明(比如变量,函数,类,类型别名或接口)都能够通过添加export关键字来导出。
export const numberRegexp = /^[0-9]+$/;
export interface StringValidator {
  isAcceptable(s: string): boolean;
}

export { ZipCodeValidator };
export { ZipCodeValidator as mainValidator }; // 重命名
export * from "./StringValidator"; // 导出全部
export { ZipCodeValidator as RegExpBasedZipCodeValidator } from "./ZipCodeValidator"; // 重新导出其他模块并重命名

重新导出

可以在一个模块中重新导出其他模块,用 as 对导入/导出内容重命名。

export class Animal {}
export { ZipCodeValidator as RegExpBasedZipCodeValidator } from "./ZipCodeValidator";

导出全部

在一个模块中包裹多个模块一并导出,用 * 表示导入/导出模块的所有内容

* 重命名可将整个模块导入/导出到一个变量。

export * from "./StringValidator"; // exports interface StringValidator
export * as LetModule from "./LettersOnlyValidator"; // exports class LettersOnlyValidator

导入

import { ZipCodeValidator } from "./ZipCodeValidator"; // 导入一个模块中的某个内容
import { ZipCodeValidator as ZCV } from "./ZipCodeValidator"; // 重命名
import * as validator from "./ZipCodeValidator"; // 将整个模块导入到一个变量,并通过它来访问模块的导出部分
import "./my-module.js"; // 一些模块会设置一些全局状态供其他模块使用

export default

类和函数声明可以直接被标记为默认导出。 标记为默认导出的类和函数的名字是可以省略的。

export default function() {}

export default class {}

模块解析

https://www.tslang.cn/docs/handbook/module-resolution.htmlopen in new window

ts 如何根据路径定位模块的类型信息

编译器首先尝试去查找相应路径下的 .ts.tsx 再或者.d.ts。 如果这些文件都找不到,编译器会查找外部模块声明。

如何解析模块

比如,有一个导入语句 import { b } from "./moduleB"/root/src/moduleA.ts 里,会以下面的流程来定位"./moduleB"

  1. /root/src/moduleB.ts
  2. /root/src/moduleB.tsx
  3. /root/src/moduleB.d.ts
  4. /root/src/moduleB/package.json (如果指定了"types"属性)
  5. /root/src/moduleB/index.ts
  6. /root/src/moduleB/index.tsx
  7. /root/src/moduleB/index.d.ts

命名空间

摘要

  1. namespace 关键字来区分命名空间。
  2. 多文件时用 /// <reference path="Validation.ts" /> 语法来引入其他命名空间文件。
  3. 嵌套的命名空间需要 import 后才能使用。
  4. 不应该对模块使用命名空间。

命名空间

namespace Valid {
  export interface StringValidator {
    isAcceptable(s: string): boolean;
  }
  export const numberRegexp = /^[0-9]+$/;
  const lettersRegexp = /^[A-Za-z]+$/;
}

let name = Valid.lettersRegexp      // error,无法使用未导出的变量
let name2 = Valid.numberRegexp      // success
let age: Valid.StringValidator      // success

多文件命名空间

多文件区分命名空间时使用标签引入

/// <reference path="Validation.ts" />

嵌套命名空间

namespace Shapes {
    export namespace Polygons {
        export class Triangle { }
        export class Square { }
    }
}

import polygons = Shapes.Polygons;
let sq = new polygons.Square(); // Same as "new Shapes.Polygons.Square()"