定义方式
- 命名空间:使用
namespace
关键字定义,例如:
namespace MyNamespace {
export const value = 10;
}
- 模块:每一个包含顶级
import
或者export
的文件都被当作一个模块。模块可以通过文件系统路径进行引用,例如:
// module.ts
export const moduleValue = 20;
作用域
- 命名空间:内部成员默认在命名空间内部有作用域,只有标记为
export
的成员才能在外部访问。不同命名空间可以嵌套,且嵌套命名空间内的成员可以访问外部命名空间的成员。
- 模块:模块有自己独立的作用域,模块内的变量、函数、类等默认是私有的,只有通过
export
导出才能被其他模块访问。模块之间相互独立,不能嵌套定义。
导入导出规则
- 命名空间:
- 导出:使用
export
关键字标记要导出的成员,如export const myVar = 'hello';
- 导入:在使用命名空间的地方,使用
/// <reference path="..."/>
指令引用包含命名空间定义的文件,在TypeScript 2.0+ 也可以使用import
关键字导入命名空间,例如import * as myNs from './myNamespaceFile';
- 模块:
- 导出:使用
export
关键字导出成员,有多种导出方式,如export const myModuleVar = 'world';
、export default function() {... }
- 导入:使用
import
关键字导入,如import {myModuleVar} from './module';
、import myDefault from './module';
应用场景
- 命名空间:适用于小型项目或库,当需要将相关代码组织在一起,避免全局命名冲突时使用。常用于内部代码组织,例如在一个单一的JavaScript文件内组织多个相关的类、函数等。
- 模块:适用于大型项目,尤其是在需要依赖管理和代码拆分的场景。模块系统更适合构建复杂的应用,因为它可以更好地管理依赖关系,实现代码的按需加载,并且在不同的模块间提供清晰的边界。