非常教程

Typescript参考手册

命名空间和模块 | Namespaces & Modules

Namespaces & Modules

关于术语的说明:重要的是要注意,在 TypeScript 1.5中,命名已经改变。“内部模块”现在是“命名空间”。“外部模块”现在只是“模块”,与 ECMAScript 2015 的术语一致(即module X {相当于现在的首选namespace X {)。

介绍

本文概述了在 TypeScript 中使用名称空间和模块组织代码的各种方法。我们还将回顾一些关于如何使用名称空间和模块的高级主题,并解决在 TypeScript 中使用它们时的一些常见缺陷。

有关模块的更多信息,请参阅模块文档。有关命名空间的更多信息,请参见命名空间文档。

使用命名空间

命名空间在全局命名空间中简单地命名为 JavaScript 对象。这使命名空间成为一个非常简单的构造。他们可以跨越多个文件,并可以使用连接--outFile。命名空间是在 Web 应用程序中构建代码的一种好方法,所有依赖项都作为<script>标记包含在 HTML 页面中。

就像所有全局名称空间污染一样,可能很难识别组件依赖关系,特别是在大型应用程序中。

使用模块

就像名称空间一样,模块可以同时包含代码和声明。主要区别是模块声明它们的依赖关系。

模块也依赖于模块加载器(如 CommonJs / Require.js)。对于一个小的JS应用程序来说,这可能不是最佳的,但对于大型应用程序来说,成本来自长期模块化和可维护性的好处。模块提供更好的代码重用,更强大的隔离和更好的捆绑工具支持。

同样值得注意的是,对于 Node.js 应用程序,模块是默认的,并且是推荐的构建代码的方法。

从 ECMAScript 2015 开始,模块是本地语言的一部分,应该由所有兼容的引擎实现来支持。因此,对于新项目模块将是推荐的代码组织机制。

命名空间和模块的缺陷

在本节中,我们将介绍使用名称空间和模块的各种常见错误,以及如何避免它们。

/// <reference> - -ing 一个模块

一个常见的错误是尝试使用/// <reference ... />语法来引用模块文件,而不是使用import语句。要理解的区别,我们首先需要了解编译器如何能找到的类型信息基础的路径上的模块import(如...import x from "...";import x = require("...");等等)的路径。

编译器会尝试找到一个.ts.tsx然后.d.ts用适当的路径找到一个。如果找不到特定文件,则编译器将查找环境模块声明。回想一下,这些需要在.d.ts文件中声明。

  • myModules.d.ts // In a .d.ts file or .ts file that is not a module: declare module "SomeModule" { export function fn(): string; }
  • myOtherModule.ts

/// <reference path="myModules.d.ts" /> import * as m from "SomeModule";

这里的引用标签允许我们找到包含环境模块声明的声明文件。这是node.d.ts几个 TypeScript 示例使用的文件如何被使用的方式。

不必命名空间

如果您将程序从命名空间转换为模块,可能很容易得到一个如下所示的文件:

  • shapes.ts 出口命名空间的形状{出口类三角{/ * ... * /}出口类方形{/ * ... * /}}这里的顶层模块Shapes包裹起来Triangle,并Square没有理由。这会让您的模块的用户感到困惑和烦恼:
  • shapeConsumer.ts

导入*为“./shapes”的形状; 让t = new shapes.Shapes.Triangle(); // shapes.Shapes?

TypeScript 中模块的一个关键特性是两个不同的模块决不会将名称贡献给同一个作用域。因为模块的使用者决定分配哪个名称,所以不需要主动将命名空间中的导出符号包装起来。

为了重申为什么你不应该尝试命名空间模块内容,命名空间的一般想法是提供逻辑分组的结构并防止名称冲突。因为模块文件本身已经是一个逻辑分组,并且其顶级名称由导入它的代码定义,所以不必为导出的对象使用额外的模块层。

这是一个修改的例子:

  • shapes.ts export class Triangle { /* ... */ } export class Square { /* ... */ }
  • shapeConsumer.ts

import * as shapes from "./shapes"; let t = new shapes.Triangle();

模块的权衡

正如 JS 文件和模块之间存在一对一的对应关系一样,TypeScript 在模块源文件和它们发出的 JS 文件之间具有一对一的对应关系。其中一个影响是,根据您的目标模块系统,无法连接多个模块源文件。举例来说,你不能使用outFile,而定位选项commonjsumd,但打字稿1.8及更高版本,它可以使用outFile定位时amdsystem

命名空间和模块 | Namespaces & Modules相关

Typescript

TypeScript 是 JavaScript 的类型的超集,它可以编译成纯 JavaScript。编译出来的 JavaScript 可以运行在任何浏览器上。

主页 https://www.typescriptlang.org
源码 https://github.com/Microsoft/TypeScript
发布版本 2.6.0