简述TypeScript 命名空间?它与模块有何不同?
在TypeScript中,命名空间(之前称为“内部模块”)是一种组织代码和避免全局命名空间污染的方式。命名空间通过namespace
关键字定义,允许将相关的接口、类、函数、和变量组织在一起。它们主要用于较大的应用程序,以帮助维护全局作用域的清洁和组织代码结构。
命名空间的用法
namespace Validation {
export interface StringValidator {
isValid(s: string): boolean;
}
const lettersRegexp = /^[A-Za-z]+/;
const numberRegexp = /^[0-9]+/;
export class LettersOnlyValidator implements StringValidator {
isValid(s: string) {
return lettersRegexp.test(s);
}
}
export class ZipCodeValidator implements StringValidator {
isValid(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}
// 使用命名空间
let validator = new Validation.LettersOnlyValidator();
命名空间与模块的区别
尽管命名空间和模块都用于组织代码,它们在使用和设计目的上有明显的不同:
- 模块:
- 模块是TypeScript对ES6模块系统的支持,每个模块对应一个文件,可以导入或导出变量、函数、类等。
- 模块可以声明它们的依赖关系,通过
import
和export
语句显式地导入和导出内容。 - 模块在其自己的作用域内执行,而不是在全局作用域中,这避免了全局命名空间的污染。
- 模块是TypeScript和现代JavaScript开发中推荐的组织代码的方式,特别是在使用现代构建工具(如Webpack、Rollup等)时。
- 命名空间:
- 命名空间提供了一种将代码组织为可重用的组(通常在一个文件中),通过
namespace
关键字定义。 - 命名空间内部的内容通过
export
关键字暴露给外部使用,但默认情况下它们在自己的作用域内。 - 命名空间可以嵌套,允许进一步组织代码。
- 命名空间主要用于组织全局脚本的代码,或者在不使用模块加载器的旧项目中避免全局命名空间污染。
- 命名空间提供了一种将代码组织为可重用的组(通常在一个文件中),通过
总的来说,模块是处理现代Web应用程序和工具链的推荐方式,它们提供了更强大和灵活的代码组织能力。命名空间在某些特定场景下仍然有用,特别是在你需要在全局命名空间中组织代码而不使用模块时。然而,随着模块系统的广泛支持和使用,命名空间的使用变得越来越少。