定义方式
- 外部模块:在TypeScript中,外部模块通常是一个单独的文件,每个文件就是一个独立的模块。文件顶层的声明(如变量、函数、类等)默认都属于该模块。例如在
math.ts
文件中定义:
export function add(a: number, b: number): number {
return a + b;
}
- 内部模块:在TypeScript早期版本(现在已被推荐使用命名空间替代),内部模块使用
module
关键字定义。它可以在一个文件内定义多个嵌套的模块结构。例如:
module MyModule {
export function greet(): string {
return 'Hello from MyModule';
}
}
作用域
- 外部模块:每个外部模块都有自己独立的作用域。模块内定义的变量、函数、类等在外部是不可见的,除非通过
export
导出。例如上述math.ts
中的add
函数,在其他文件中如果不导入就无法使用。
- 内部模块:内部模块(命名空间)的作用域也是相对独立的,但它是在文件内进行逻辑分组。内部模块内的成员默认是私有的,只有通过
export
才能在外部访问。例如在包含MyModule
的文件内,其他部分代码若不通过MyModule.greet()
无法直接调用greet
函数。
导入导出规则
- 外部模块:
- 导出:使用
export
关键字来导出模块中的成员,可以导出变量、函数、类等。例如export const PI = 3.14;
。也可以使用export default
来导出一个默认成员,一个模块只能有一个export default
。例如export default class Person {}
。
- 导入:使用
import
关键字导入模块成员。如果导入默认导出,语法为import Person from './person';
;如果导入具名导出,语法为import { add } from './math';
。还可以使用* as
形式导入整个模块为一个对象,如import * as math from './math'; math.add(1, 2);
。
- 内部模块:
- 导出:同样使用
export
关键字使内部模块成员可在外部访问,如module MyModule { export function greet() {} }
。
- 导入:在TypeScript中,对于内部模块(命名空间),使用
import
关键字导入命名空间成员。例如,如果有一个UI
命名空间,在另一个地方可以import { Button } from './ui';
(假设Button
是UI
命名空间中导出的成员)。不过,命名空间之间的导入更多是在同一文件或通过/// <reference path="..." />
指令关联不同文件间使用 。