export =

在 commonjs 规范中,我们用以下方式来导出:

  1. // 整体导出
  2. module.exports = foo;
  3. // 单个导出
  4. exports.bar = bar;

在 ts 中,针对这种导出,有多种方式可以导入,第一种方式是 const … = require:

// 整体导入
const foo = require("foo");
// 单个导入
const bar = require("foo").bar;

第二种方式是 import … from,注意针对整体导出,需要使用 import * as 来导入:

// 整体导入
import \* as foo from 'foo';
// 单个导入
import { bar } from 'foo';

第三种方式是 import … require,这也是 ts 官方推荐的方式:

// 整体导入
import foo = require('foo');
// 单个导入
import bar = require('foo').bar;

对于这种使用 commonjs 规范的库,假如要给它写类型声明文件的话,就需要使用到 export = 这种语法了:

// types/foo/index.d.ts

export = foo;

declare function foo(): string;
declare namespace foo {
  const bar: number;
}

需要注意的是,上例中由于使用了 export = 之后,就不能再单个导出 export { bar } 了。所以我们通过声明合并,使用 declare namespace foo 来将 bar 合并到 foo 里。
准确地讲,export = 不仅可以用在声明文件中,也可以用在普通的 ts 文件中。实际上,import … require 和 export = 都是 ts 为了兼容 AMD 规范和 commonjs 规范而创立的新语法,由于并不常用也不推荐使用,所以这里就不详细介绍了,感兴趣的可以看官方文档。
由于很多第三方库是 commonjs 规范的,所以声明文件也就不得不用到 export = 这种语法了。但是还是需要再强调下,相比与 export =,我们更推荐使用 ES6 标准的 export default 和 export。