# 模块

本章讲解 TypeScript 中的模块。开始之前阅读 MDN 模块 (opens new window) 了解 ES6 等模块系统的基本概念。这里重点介绍 TypeScript 的扩充

# 类型

在 ES6 中使用 export

# export

类似 es6 module 规范,类型申明的作用范围为当前文件。 为了复用类型申明,可采用 export,import 等语法来导出申明。

你可以复用所有 es6 module 的语法,用于申明类型的导出和引用

注意由于类型申明会和实际模块申明同时存在,所以需要避免命名冲突。

# 导入省略

TypeScript 复用了 es6 模块语法实现类型导出。若 import 导入的只是类型申明, typescript 会在编译后忽略该导入。这导致对于同时是类型或变量的内容会出错。示例 导入缺省

// 文件 a.ts
export class Foo {
  greet() {
    console.log('greet');
  }
}

// 一些全局操作,此处以 console.log 举例
console.log('global init');

// 文件 b.ts
// 由于 typescript 认为此处指类型导入,在编译后会忽略,使得 a.js 中的相关操作无法执行
import { Foo } from './a';

// 为了避免删除的导入缺省,重新导入此文件执行初始化操作
import './a';

由于 TypeScript 识别 Foo 为类型导出,导致 import 被忽略,使 a.ts 无法触发,所以需要导入两次。该缺陷叫做 导入省略

笔者注: TypeScript 复用 es 模块的语法来实现类型的导入和导出,这产生了二义性(一个语言特性同时具备两种功能),导致引入了新的问题

基于此在 TypeScript 3.8 Beta (opens new window) 引入了 import type 来显示申明类型导出, 避免了此错误

import types (opens new window)

# export =

在 ES 模块系统中并没有此语言特性,该特性来源 Commonjs 和 AMD 。你可以通过 module.exports 导出整个模块。基于此 TypeScript 提供了类似机制,示例 exprot =

由于采用此导出,导入必须使用 require 才可生效

# 模块申明 *.d.ts

由于类型的作用于只限定在当前文件,为了实现全局类型的复用。 TypeScript 借鉴了 C,C++ 语言中的头文件模式,通过定义 *.d.ts 的文件。TypeScript 会默认查找此文件该文件中的内容会在全局有效。

# [Shorthand ambient module declarations

](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#shorthand-ambient-module-declarations) 快捷环境模块申明 采用

// 对于没有类型定义的模块使用类似定义避免应用模块报错
declare module  "ModuleName";

此时使用模块中内容不会报错

import x, { y } from "hot-new-module";
x(y);

# Wildcard character in module names (opens new window) 模式处理特定模式的模块导入

  • * 匹配任意多字符
declare module "*!text" {
  const content: string;
  export default content;
}
// Some do it the other way around.
declare module "json!*" {
  const value: any;
  export default value;
}

此时支持导入

import fileContent from "./xyz.txt!text";
import data from "json!http://example.com/data.json";
console.log(data, fileContent);

采用 declare module "myLibrary/*" 声明特定子路径所有模块

import { readFile } from "myLibrary/fileSystem/readFile`;
readFile(); // readFile is 'any'

# export type

详见 export type (opens new window)

# 知识点