module.exports у машинопис


84

хтось знає, як зробити 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?

Відповіді:


77

Ви можете експортувати один клас у 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 ... bla bla bla? Думаю, це було б логічно, ні? або мені чогось не вистачає?
Арсен Мкртчян

1
Чи можливо все-таки експортувати деякі типи з файлу? Можливо, ви захочете отримати типізації з файлу, щоб писати тести, але все-таки хочете, щоб module.exportsв кінці.
Ерік Бурель,

21

Це вже реалізовано і готово в TypeScript 0.9 :)


10
Для уточнення (оскільки мені довелося піти на розкопки), синтаксис в 0.9 доступний тут: blogs.msdn.com/b/typescript/archive/2013/06/18/… (у розділі "Експорт =").
Ден,

3
А для подальшого роз’яснення, для майбутніх читачів, це було впроваджено ТОЛЬКО саме так, як бажав запитувач. . . Але те, що я справді хочу, - export = Greeter; це саме те, що ти робиш :)
Binary Worrier

1
Я хотів просто виставити об'єкт конфігурації config/db.tsта використовувати цю конфігурацію в додатку. Це те , що я міг зробити успішно в друкованому 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);
Gurjeet Singh

10

Тому я думаю, що я знайшов обхідний шлях. Просто оберніть ключове слово 'module' у дужках у вашому .ts-файлі:

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

Створений файл javascript буде абсолютно однаковим:

(module).exports = MyClass;

Зауважте, що краще, ніж самостійно оголошувати модуль var, завантажте файл визначення node.d.ts та вставте його в ту ж директорію, що і файл TypeScript . Ось повний зразок експрес-файлу маршрутизації 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.