12. 模块

TS系列78529 阅读0

任何包含 import 或 export 语句的文件,就是一个模块(module)。相应地,如果文件不包含 export 语句,就是一个全局的脚本文件。

模块本身就是一个作用域,不属于全局作用域。模块内部的变量、函数、类只在内部可见,对于模块外部是不可见的。暴露给外部的接口,必须用 export 命令声明;如果其他文件要使用模块的接口,必须用 import 命令来输入。

如果一个文件不包含 export 语句,但是希望把它当作一个模块(即内部变量对外不可见),可以在脚本头部添加一行语句。

export {};

上面这行语句不产生任何实际作用,但会让当前文件被当作模块处理,所有它的代码都变成了内部代码。

TypeScript 允许加载模块时(import),省略模块文件的后缀名。

在编译(tsc)一个文件时,如果这个文件引用了其他模块,会将这个模块文件一起编译。

如果模块exprot的是一个类型,那么需要在import的地方加上Type:

// a.ts
export interface A {
foo: string;
}

export let a = 123;

import { type A, a } from './a';
import type { A } from './a'; // 只能用来引用Type

同理,export类型的时候也能这样写:

type A = 'a';
type B = 'b';

// 方法一
export {type A, type B};

// 方法二
export type {A, B};

CommonJS 模块

CommonJS 是 Node.js 的专用模块格式,与 ES 模块格式不兼容。

TypeScript 使用import =语句输入 CommonJS 模块。

import fs = require('fs');
const code = fs.readFileSync('hello.ts', 'utf8');

上面示例中,使用import =语句和require()命令输入了一个 CommonJS 模块。模块本身的用法跟 Node.js 是一样的。

除了使用import =语句,TypeScript 还允许使用import * as [接口名] from "模块文件"输入 CommonJS 模块。

import * as fs from 'fs';
// 等同于
import fs = require('fs');

TypeScript 使用export =语句,输出 CommonJS 模块的对象,等同于 CommonJS 的module.exports对象。

let obj = { foo: 123 };

export = obj;

export =语句输出的对象,只能使用import =语句加载。


import obj = require('./a');

console.log(obj.foo); // 123

评论

发表评论