简述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模块系统的支持,每个模块对应一个文件,可以导入或导出变量、函数、类等。
    • 模块可以声明它们的依赖关系,通过importexport语句显式地导入和导出内容。
    • 模块在其自己的作用域内执行,而不是在全局作用域中,这避免了全局命名空间的污染。
    • 模块是TypeScript和现代JavaScript开发中推荐的组织代码的方式,特别是在使用现代构建工具(如Webpack、Rollup等)时。
  • 命名空间
    • 命名空间提供了一种将代码组织为可重用的组(通常在一个文件中),通过namespace关键字定义。
    • 命名空间内部的内容通过export关键字暴露给外部使用,但默认情况下它们在自己的作用域内。
    • 命名空间可以嵌套,允许进一步组织代码。
    • 命名空间主要用于组织全局脚本的代码,或者在不使用模块加载器的旧项目中避免全局命名空间污染。

总的来说,模块是处理现代Web应用程序和工具链的推荐方式,它们提供了更强大和灵活的代码组织能力。命名空间在某些特定场景下仍然有用,特别是在你需要在全局命名空间中组织代码而不使用模块时。然而,随着模块系统的广泛支持和使用,命名空间的使用变得越来越少。

发表评论

后才能评论