TypeScript中文手册
13,模块
> 模块在其自身的作用域里执行,而不是在全局作用域里;这意味着定义在一个模块里的变量,函数,类等等在模块外部是不可见的,除非你明确地使用[`export`形式](https://www.tsdev.cn/modules.html#export)之一导出它们。 相反,如果想使用其它模块导出的变量,函数,类,接口等的时候,你必须要导入它们,可以使用[`import`形式](https://www.tsdev.cn/modules.html#import)之一。 > 模块是自声明的;两个模块之间的关系是通过在文件级别上使用imports和exports建立的。 > 任何包含顶级`import`或者`export`的文件都被当成一个模块。 ### 13.1 导出 - 导出声明 export ```typescript export interface StringValidator { isAcceptable(s: string): boolean; } ``` - 导出语句 ```typescript class ZipCodeValidator implements StringValidator { isAcceptable(s: string) { return s.length === 5 && numberRegexp.test(s); } } export { ZipCodeValidator }; export { ZipCodeValidator as mainValidator }; //可对导出的部分重命名 ``` - 重新导出 > 我们经常会去扩展其它模块,并且只导出那个模块的部分内容。 重新导出功能并不会在当前模块导入那个模块或定义一个新的局部变量。 ### 13.2 导入 ```typescript //import形式之一来导入其它模块中的导出内容 import { ZipCodeValidator } from "./ZipCodeValidator"; let myValidator = new ZipCodeValidator(); //可以对导入内容重命名 import { ZipCodeValidator as ZCV } from "./ZipCodeValidator"; let myValidator = new ZCV(); //将整个模块导入到一个变量,并通过它来访问模块的导出部分 import * as validator from "./ZipCodeValidator"; let myValidator = new validator.ZipCodeValidator(); //具有副作用的导入模块:这些模块可能没有任何的导出或用户根本就不关注它的导出 import "./my-module.js"; ``` ### 13.3 默认导出 > 每个模块都可以有一个`default`导出。 默认导出使用`default`关键字标记;并且一个模块只能够有一个`default`导出。 需要使用一种特殊的导入形式来导入`default`导出。 ```typescript //JQuery.d.ts declare let $: JQuery; export default $; //App.ts import $ from "JQuery"; $("button.continue").html( "Next Step..." ); ``` ```typescript //ZipCodeValidator.ts export default class ZipCodeValidator { static numberRegexp = /^[0-9]+$/; isAcceptable(s: string) { return s.length === 5 && ZipCodeValidator.numberRegexp.test(s); } } //Test.ts import validator from "./ZipCodeValidator"; let myValidator = new validator(); ``` - `export =` 和 `import = require()` > `export =`语法定义一个模块的导出对象。 它可以是类,接口,命名空间,函数或枚举。 > > 若要导入一个使用了`export =`的模块时,必须使用TypeScript提供的特定语法`import module = require("module")`。 ```typescript //ZipCodeValidator.ts let numberRegexp = /^[0-9]+$/; class ZipCodeValidator { isAcceptable(s: string) { return s.length === 5 && numberRegexp.test(s); } } export = ZipCodeValidator; //Test.ts import zip = require("./ZipCodeValidator"); ``` ### 13.4 生成模块代码 ### 13.5 可选的模块加载和其它高级加载场景 ### 13.6 使用其它的JavaScript库 > 要想描述非TypeScript编写的类库的类型,我们需要声明类库所暴露出的API。 > > 我们叫它声明因为它不是“外部程序”的具体实现。 它们通常是在`.d.ts`文件里定义的。 > > 在Node.js里大部分工作是通过加载一个或多个模块实现的。 我们可以使用顶级的`export`声明来为每个模块都定义一个`.d.ts`文件,但最好还是写在一个大的`.d.ts`文件里。 我们使用与构造一个外部命名空间相似的方法,但是这里使用`module`关键字并且把名字用引号括起来,方便之后`import`。 ### 13.7 创建模块结构指导 - 尽可能地在顶层导出 - 如果仅导出单个 class 或 function,使用 export default ```typescript export default function getThing() { return 'thing'; } ``` - 如果要导出多个对象,把它们放在顶层里导出 ```typescript export class SomeType { /* ... */ } export function someFunc() { /* ... */ } ``` - 明确地列出导入的名字 ```typescript import { SomeType, SomeFunc } from "./MyThings"; let x = new SomeType(); let y = someFunc(); ``` - 使用命名空间导入模式当你要导出大量内容的时候 ```typescript //MyLargeModule.ts export class Dog { ... } export class Cat { ... } export class Tree { ... } export class Flower { ... } ``` ```typescript //Consumer.ts import * as myLargeModule from "./MyLargeModule.ts"; let x = new myLargeModule.Dog(); ``` - 使用重新导出进行扩展 - 模块里不要使用命名空间 - 模块具有其自己的作用域,并且只有导出的声明才会在模块外部可见。 记住这点,命名空间在使用模块时几乎没什么价值。 - 危险信号 - 文件的顶层声明是`export namespace Foo { ... }` (删除`Foo`并把所有内容向上层移动一层) - 文件只有一个`export class`或`export function` (考虑使用`export default`) - 多个文件的顶层具有同样的`export namespace Foo {` (不要以为这些会合并到一个`Foo`中!)
顶部
收展
底部
[TOC]
目录
1,基础类型
2,变量声明
3,接口
4,类
5,函数
6,泛型
7,枚举
8,类型推论
9,类型兼容性
10,高级类型
11,符号Symbols
12,Iterators(迭代)
13,模块
14,命名空间
15,模块解析