TypeScript 中的模块系统介绍

阅读时长 7 分钟读完

TypeScript 是一种由 Microsoft 开发的 JavaScript 的超集。除了继承了 JavaScript 的语法和特性之外,TypeScript 还添加了一些新的功能,其中之一就是模块系统。在前端开发中,模块系统常常用于在不同的文件之间组织代码、复用代码和解决命名冲突等问题。在本文中,我们将深入研究 TypeScript 中的模块系统。

模块的概念

在 TypeScript 中,一个模块就是一个独立的代码组件,它可以包含变量、函数、类、接口、枚举和其他模块等多种形式的代码,并且模块的内部成员默认是私有的,只有在模块内部才能访问。要在模块外部访问模块内部的成员,必须显式导出这些成员,并在导入它们的模块中进行引用。

在 TypeScript 中,有两种类型的模块:内部模块和外部模块。内部模块也叫命名空间,它是一种封装机制,用于组织和保护代码。外部模块也叫模块,它是一种在不同的文件之间共享代码的结构化方式。我们重点讨论外部模块的使用。

模块的导出

在 TypeScript 中,一个模块可以导出任意数量的成员,包括变量、函数、类、接口和其他模块等。要导出一个成员,我们可以使用 export 关键字,然后在导入它的模块中使用 import 关键字进行引用。

-- -------------------- ---- -------
-- ------- --
------ ----- -- - --------

------ -------- --------- -------- ------ -
  ------ - - --
-

------ ----- ------ -
  ------------------- ------- ------- --

  --- ------------ ------ -
    ------ - - ------- - ------------
  -

  --- ------- ------ -
    ------ ------- - ----------- - ------------
  -
-

-- ------ --
------ - --- ------- ------ - ---- ---------

----- ------ - ---
----- ------ - --- ---------------

---------------- --------- ------ ----------------------- -----------------
------------------- --------------------
----------------- --------

上面的示例定义了一个 math.ts 模块,它导出了一个常量、一个函数和一个类。在另一个模块 app.ts 中,我们使用 import 关键字引入了 math.ts 模块中的三个成员,并在其中使用了这些成员。

模块的导入

在 TypeScript 中,要导入一个模块中的成员,我们可以使用 import 关键字,后加一对花括号 { },中间添加导入的成员名,并指定从哪个模块导入。如果要给导入的成员添加别名,可以使用 as 关键字。

-- -------------------- ---- -------
-- ------ --
------ - -- -- ---------- ------- ------ - ---- ---------

----- ------ - ---
----- ------ - --- ---------------

---------------- --------- ------ ----------------------- -----------------
------------------- --------------------
----------------- ---------------

上面的示例导入了 math.ts 模块中的三个成员,并为其中的 PI 常量添加了别名 PI_NUMBER

TypeScript 中的模块系统还支持导入一个模块中的所有成员,可以使用 * as 关键字来实现。

-- -------------------- ---- -------
-- ------ --
------ - -- ---- ---- ---------

----- ------ - ---
----- ------ - --- --------------------

---------------- --------- ------ ----------------------- -----------------
------------------- -------------------------
----------------- -------------

上面的示例导入了 math.ts 模块中的所有成员,并用 math 对象来引用其中的成员。

模块的默认导入

在 TypeScript 中,一个模块可以指定一个默认导出。默认导出是一个模块的主要导出,它不需要使用花括号 { } 来引用,并且可以使用 as 关键字给默认导出起一个别名。如果一个模块仅仅导出一个成员,那么它应当是默认导出。

-- -------------------- ---- -------
-- ---------- --
------ ------- ----- ------- -
  ------------------- ----- ------- --

  ------ -------- ------ -
    ------ ------- ---------------
  -
-

-- ------ --
------ ----- ---- ------------

----- ------- - --- ----------------
-----------------------------

上面的示例定义了一个默认导出的 Greeter 类,并在另一个模块 app.ts 中使用了这个类。

默认导出可以和普通导出同时存在,并且可以和 * as 导入同时使用。

-- -------------------- ---- -------
-- --------- --
------ ----- ---------- - --------------------------
------ ----- ------- - ---------

------ ------- -
  ------------ -------- ------ -
    ------ --------------------------------------
  -
--

-- ------ --
------ ------- - ---------- - ---- -----------

---------------- ---- ---- ----------------
---------------- ---- -------------------- -------------

上面的示例定义了一个默认导出的配置对象,并在另一个模块 app.ts 中同时使用了它和一个普通导出的常量。

模块的路径

在 TypeScript 中,要与外部模块交互,我们需要知道它们所在的文件和路径。TypeScript 的模块路径可以是相对路径或绝对路径。

相对路径是相对于当前模块的路径计算的,可以使用相对路径来引用同一目录下的模块,也可以使用 .././ 来引用父目录或当前目录下的模块。

绝对路径是相对于根路径计算的,可以使用根路径来引用项目中的任意模块。在 TypeScript 中,根路径是通过配置文件 tsconfig.json 中的 baseUrlpaths 来定义的。例如:

上面的配置指定了根路径为当前目录 .,并将所有以 src/ 开头的模块路径映射到 src/ 目录下。这样,在模块中使用 importexport 时,就可以使用相对路径和根路径的方式进行导入和导出。

总结

TypeScript 中的模块系统是一种强大而灵活的结构化方式,它使得代码可以被分解成独立的组件,并可以在不同的文件之间共享。在编写 TypeScript 代码时,我们应当熟悉模块的导出和导入、路径的管理和默认导出的使用。这些知识可以使我们更好地组织代码、避免命名冲突、提高代码复用性和可维护性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6460d484968c7c53b0270a75

纠错
反馈