# 模块
本章讲解 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)