Как заставить TypeScript сгенерировать CommonJS действительный модуль? - PullRequest
2 голосов
/ 01 июня 2019

Допустим, у меня есть модуль на языке TypeScript:

export default function myModule(name: string): void {
  alert(`Hello, ${name}!`)
}

Когда я запускаю tsc, чтобы построить приведенный выше код, и пытаюсь импортировать сгенерированный код через Node.js (чистый JavaScript):

const myModule = require('./dist/myModule.js')
myModule('Luiz') // ERROR! `myModule` is `undefined`

Единственный способ заставить его работать, это использовать .default после require(), а это не то, что я хочу:

//                                            ↓↓↓↓↓↓↓↓
const myModule = require('./dist/myModule.js').default
myModule('Luiz') // Now it works.

Как я могу заставить TypeScript генерироватьвывод, который я могу использовать позже как модуль Node.js (так как я публикую пакет в NPM) без этого свойства .default?Вот так:

const myModule = require('my-module')

Заранее спасибо.:)

1 Ответ

1 голос
/ 01 июня 2019

Короткий ответ

Используйте export = для создания модуля CommonJS, который экспортирует функцию.

Документы TypeScript говорят :

TypeScript поддерживает export = для моделирования традиционных рабочих процессов CommonJS и AMD ... Синтаксис export = определяет один объект, который экспортируется из модуля. Это может быть класс, интерфейс, пространство имен, функция или перечисление.

Полная настройка

myModule.ts

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

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs"
  }
}

myModule.js (вывод)

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

demo.js (использование)

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

myModule('Luiz'); // Hello, Luiz!
...