跳到主要内容

TypeScript 模块

摘要:在本教程中,你将了解 TypeScript 模块以及如何使用它们来构建代码。

TypeScript 模块简介

自 ES6 以来,JavaScript 开始支持模块作为该语言的内置功能。 TypeScript 与 JavaScript 具有相同的模块概念。

TypeScript 模块可以包含声明和代码。 模块在其自己的作用域内执行,而不是在全局作用域内执行。 这意味着当你在模块中声明变量、函数、类、接口等时,它们在模块外部不可见,除非你使用 export 语句显式导出它们。

另一方面,如果你想从模块访问变量、函数、类等,则需要使用 import 语句导入它们。

与 ES6 一样,当 TypeScript 文件含有 import 或者 export 时,它被视为模块。

创建一个新模块

以下创建一个名为 Validator.ts 的新模块并声明一个名为 Validator 的接口:

export interface Validator {
isValid(s: string): boolean
}

在这个模块中,我们将 export 关键字放在 interface 关键字之前,以将其暴露给其他模块。

换句话说,如果不使用 export 关键字,则 Validator 接口在 Validator.ts 模块中是私有的,因此不能被其他模块使用。

export 语句

从模块导出声明的另一种方法是使用 export 语句。 例如:

interface Validator {
isValid(s: string): boolean
}

export { Validator };

TypeScript 还允许你重命名模块使用者的声明,如下所示:

interface Validator {
isValid(s: string): boolean
}

export { Validator as StringValidator };

在本例中,其他模块将把 Validator 接口作为 StringValidator 接口使用。

导入新模块

要使用模块,请使用 import 语句。 以下创建一个使用 Validator.ts 模块的新模块 EmailValidator.ts

import { Validator } from './Validator';

class EmailValidator implements Validator {
isValid(s: string): boolean {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(s);
}
}

export { EmailValidator };

当你导入一个模块时,你可以像这样重命名它:

import { Validator as StringValidator } from './Validator';

EmailValidator 模块内,可以使用 Validator 接口作为 StringValidator 接口:

import { Validator as StringValidator } from './Validator';

class EmailValidator implements StringValidator {
isValid(s: string): boolean {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(s);
}
}

export { EmailValidator };

下面展示了如何使用 App.ts 文件中的 EmailValidator 模块:

import { EmailValidator } from './EmailValidator';

let email = '[email protected]';
let validator = new EmailValidator();
let result = validator.isValid(email);

console.log(result);

输出:

true

导入类型

下面声明了一个在名为 Types.ts 模块中定义的类型:

export type alphanumeric = string | number;

要从 Types.ts 模块导入 alphanumeric 类型,可以使用 import type 语句:

import type {alphanumeric} from './Types';

请注意,TypeScript 从 3.8 版本开始支持 import type 语句。 在 TypeScript 3.8 之前,你需要使用 import 语句:

import {alphanumeric} from './Types';

从模块导入所有内容

要从模块导入所有内容,请使用以下语法:

import * from 'module_name';

重新导出

以下创建一个名为 ZipCodeValidator.ts 的新模块,该模块使用了 Validator.ts 模块:

import { Validator } from './Validator';

class ZipCodeValidator implements Validator {
isValid(s: string): boolean {
const numberRegexp = /^[0-9]+$/;
return s.length === 5 && numberRegexp.test(s);
}
}

export { ZipCodeValidator };

你可以使用以下语法组合所有导出,将 EmailValidatorZipCodeValidator 模块包装在新模块中:

export * from 'module_name';

以下示例展示了如何将 EmailValidator.tsZipCodeValidator.ts 模块包装在 FormValidator.ts 模块中:

export * from "./EmailValidator";
export * from "./ZipCodeValidator";

默认导出项

TypeScript 允许每个模块有一个默认导出项。 要将导出标记为默认导出项,请使用 default 关键字。

下面显示了如何将 ZipCodeValidator 导出为默认导出项:

import { Validator } from './Validator';

export default class ZipCodeValidator implements Validator {
isValid(s: string): boolean {
const numberRegexp = /^[0-9]+$/;
return s.length === 5 && numberRegexp.test(s);
}
}

要导入一个默认导出项,你需要使用另一种导入语法,如下所示:

import default_export from 'module_name';

下面显示了如何在 App.ts 文件中使用 ZipCodeValidator 的默认导出项:

import ZipCodeValidator from './ZipCodeValidator';

let validator = new ZipCodeValidator();
let result = validator.isValid('95134');

console.log(result);

输出:

true

概括

  • TypeScript 与 ES6 模块共享相同的模块概念。 模块可以包含声明和代码。
  • 在模块中,变量、函数、类、接口等在它们自己的作用域中执行,而不是全局作用域。
  • 使用 export 语句从模块导出变量、函数、类、接口、类型等。
  • 使用 import 语句访问其他模块的导出项。