如何让 TypeScript 生成一个 CommonJS 有效模块?

Lui*_*ipe 5 module commonjs typescript

假设我在 TypeScript 中有一个模块:

export default function myModule(name: string): void {
  alert(`Hello, ${name}!`)
}
Run Code Online (Sandbox Code Playgroud)

当我运行tsc构建上述代码,并尝试通过Node.js(纯JavaScript)导入生成的代码时:

const myModule = require('./dist/myModule.js')
myModule('Luiz') // ERROR! `myModule` is `undefined`
Run Code Online (Sandbox Code Playgroud)

使其工作的唯一方法是.default在 之后使用require(),这不是我想要的:

//                                            ????????
const myModule = require('./dist/myModule.js').default
myModule('Luiz') // Now it works.
Run Code Online (Sandbox Code Playgroud)

如何让 TypeScript 生成一个输出,我可以在没有该.default属性的情况下将其用作 Node.js 模块(因为我将包发布到 NPM 中)?像这样:

const myModule = require('my-module')
Run Code Online (Sandbox Code Playgroud)

提前致谢。:)

Sha*_*tin 5

简答

使用export =建立一个CommonJS的模块,出口功能。

该打字稿文档说:

TypeScript 支持export =对传统的 CommonJS 和 AMD 工作流进行建模...export =语法指定从模块导出的单个对象。这可以是类、接口、命名空间、函数或枚举。

完整设置

myModule.ts

export = function myModule(name: string): void {
  console.log(`Hello, ${name}!`)
}
Run Code Online (Sandbox Code Playgroud)

配置文件

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs"
  }
}
Run Code Online (Sandbox Code Playgroud)

myModule.js(输出)

"use strict";
module.exports = function myModule(name) {
    console.log("Hello, " + name + "!");
};
Run Code Online (Sandbox Code Playgroud)

demo.js(用法)

const myModule = require('./my-module');

myModule('Luiz'); // Hello, Luiz!
Run Code Online (Sandbox Code Playgroud)

  • 为什么 tsc 无法将“export default”转换为“export =”?真奇怪。 (10认同)