module.exports в машинописном тексте

85

кто-нибудь знает, как сделать module.exports?

Я пробовал несколько разных способов получить

export class Greeter {}

который будет компилироваться в

exports.Greeter = Greeter;

Но на самом деле я хочу вот что:

exports = Greeter;

Чтобы я мог использовать это так:

import { Greeter } from "greeter";

const greeter = new Greeter();

и нет

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();

Возможно ли это с помощью Typescript?

Керстен
источник

Ответы:

78

Вы можете экспортировать один класс в TypeScript следующим образом:

class Person {

  private firstName: string;
  private lastName: string;

  constructor(firstName: string, lastName: string) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  public getFullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

export = Person;

И вот как это будет использоваться:

var Person = require('./dist/commonjs/Person.js');

var homer = new Person('Homer', 'Simpson');
var name = homer.getFullName();

console.log(name); // Homer Simpson

Для полноты, вот мой tsconfig.json (я использую TypeScript v2.0.3):

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist/commonjs",
    "rootDir": "src/ts",
    "target": "es5"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}
Бенни Нойгебауэр
источник
Большое спасибо! Интересно, почему в машинописном тексте не реализован экспорт Person ... бла-бла-бла? Думаю, это было бы логично, нет? или я что-то упускаю?
Арсен Мкртчян
1
Можно ли по-прежнему экспортировать некоторые наборы текста из файла? Возможно, вы захотите получить типизацию из файла для написания тестов, но все равно захотите получить module.exportsв конце.
Эрик Бурел
21

Теперь это реализовано и готово в TypeScript 0.9 :)

Керстен
источник
10
Для пояснения (поскольку мне пришлось копать это), синтаксис версии 0.9 доступен здесь: blogs.msdn.com/b/typescript/archive/2013/06/18/… (в разделе «Export =»).
Дэн
3
И для дальнейшего пояснения, для будущих читателей, он был реализован ПОЧТИ в точности так, как желал спрашивающий. . . Но я действительно хочу export = Greeter; , чтобы это именно то, что вы делаете :)
Binary Worrier
1
Я хотел просто открыть объект конфигурации config/db.tsи использовать эту конфигурацию в приложении. Это то, что я мог успешно сделать в TypeScript 1.4: config/db.tsписать var config = {connStr:'postgres://user:pass@host/dbname'}; export = config;и app.tsссылаться на это какimport dbConfig = require('./config/db'); dbConnect(dbConfig.connStr);
Гурджит Сингх
10

Думаю, я нашел обходной путь. Просто заключите ключевое слово «модуль» в скобки в своем файле .ts:

declare var module: any;
(module).exports = MyClass;

Сгенерированный файл javascript будет точно таким же:

(module).exports = MyClass;

Обратите внимание: лучше, чем самостоятельно объявлять модуль var, скачать файл определения node.d.ts и поместить его в тот же каталог, что и ваш файл машинописного текста. Вот полный пример файла маршрутизации Express node.js, который предполагает, что node.d.ts находится в том же каталоге:

/// <reference path="node.d.ts" />
var SheetController = function () {
    this.view = function (req, res) {
        res.render('view-sheet');
    };
};
(module).exports = SheetController;

Затем я могу создать новый SheetController и (используя экспресс) назначить метод просмотра:

var sheetController = new SheetController();
app.get('/sheet/view', sheetController.view);

Я полагаю, что любое ключевое слово можно избежать с помощью этого шаблона:

declare var reservedkeyword: any;
(reservedkeyword).anything = something;
Даниэль Флауэр
источник
2

Это уродливо и взломано, но вы все равно можете:

class Greeter {}
declare var exports:any;
exports = Greeter;

Что компилируется в:

var Greeter = (function () {
    function Greeter() { }
    return Greeter;
})();
exports = Greeter;
Питер Бернс
источник
1
К сожалению, компилятор TypeScript не справляется с этим хорошо. Например, при этом вы не можете наследовать от класса.
dcstraw
как это будет работать? Разве это не весь спор CommonJs против AMD. Что Common не поддерживает возврат материала напрямую в качестве переменной экспорта?
Джордж Мауэр