【TypeScript】模块&命名空间
2021/09/09 09:36:33
摘要
as
关键字用来进行导入/导出模块的重命名。*
来导入/导出一个模块的所有内容。- 对
*
重命名可将整个模块导入/导出到一个变量。
导出
// 任何声明(比如变量,函数,类,类型别名或接口)都能够通过添加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.html
ts 如何根据路径定位模块的类型信息
编译器首先尝试去查找相应路径下的 .ts
,.tsx
再或者.d.ts
。 如果这些文件都找不到,编译器会查找外部模块声明。
如何解析模块
比如,有一个导入语句 import { b } from "./moduleB"
在 /root/src/moduleA.ts
里,会以下面的流程来定位"./moduleB"
:
- /root/src/moduleB.ts
- /root/src/moduleB.tsx
- /root/src/moduleB.d.ts
- /root/src/moduleB/package.json (如果指定了"types"属性)
- /root/src/moduleB/index.ts
- /root/src/moduleB/index.tsx
- /root/src/moduleB/index.d.ts
命名空间
摘要
namespace
关键字来区分命名空间。- 多文件时用
/// <reference path="Validation.ts" />
语法来引入其他命名空间文件。 - 嵌套的命名空间需要
import
后才能使用。 - 不应该对模块使用命名空间。
命名空间
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()"