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 не поддерживает возврат материала напрямую в качестве переменной экспорта?
— Джордж Мауэр
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.