module.exports w maszynie

85

czy ktoś wie, jak zrobić module.exports?

Wypróbowałem kilka różnych sposobów na zakończenie

export class Greeter {}

który zostanie skompilowany do

exports.Greeter = Greeter;

Ale to, czego naprawdę chcę, to:

exports = Greeter;

Aby móc go używać w ten sposób:

import { Greeter } from "greeter";

const greeter = new Greeter();

i nie

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();

Czy jest to możliwe w przypadku maszynopisu?

Kersten
źródło

Odpowiedzi:

78

Możesz wyeksportować pojedynczą klasę w TypeScript w następujący sposób:

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;

A oto jak to będzie używane:

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

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

console.log(name); // Homer Simpson

Aby zakończyć, oto mój tsconfig.json (używam TypeScript v2.0.3):

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist/commonjs",
    "rootDir": "src/ts",
    "target": "es5"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}
Benny Neugebauer
źródło
Wielkie dzięki! Zastanawiam się, dlaczego maszynopis nie zaimplementował eksportu Person ... bla bla bla? Myślę, że to byłoby logiczne, nie? czy coś mi brakuje?
Arsen Mkrtchyan
1
Czy nadal byłoby możliwe wyeksportowanie niektórych tekstów z pliku? Możesz chcieć pobrać dane z pliku, aby napisać testy, ale nadal chcesz mieć module.exportsna końcu.
Eric Burel
21

Zostało to już zaimplementowane i jest gotowe w TypeScript 0.9 :)

Kersten
źródło
10
Dla wyjaśnienia (ponieważ musiałem to wykopać), składnia w 0.9 jest dostępna tutaj: blogs.msdn.com/b/typescript/archive/2013/06/18/… (pod "Export =").
Dan,
3
Dla dalszych wyjaśnień, dla przyszłych czytelników, zostało ono wdrożone PRAWIE dokładnie tak, jak sobie tego życzył pytający. . . Ale to, czego naprawdę chcę export = Greeter; , to dokładnie to, co robisz :)
Binary Worrier,
1
Chciałem po prostu ujawnić obiekt konfiguracyjny z config/db.tsi użyć tej konfiguracji w aplikacji. Oto, co udało mi się z powodzeniem zrobić w języku TypeScript 1.4: na config/db.tspiśmie var config = {connStr:'postgres://user:pass@host/dbname'}; export = config;i app.tsnazywanie go jakoimport dbConfig = require('./config/db'); dbConnect(dbConfig.connStr);
Gurjeet Singh,
10

Więc myślę, że znalazłem obejście. Po prostu zawiń słowo kluczowe „module” w nawiasach w pliku .ts:

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

Wygenerowany plik javascript będzie dokładnie taki sam:

(module).exports = MyClass;

Uwaga, lepiej niż samodzielnie deklarować moduł var, pobierz plik definicji node.d.ts i umieść go w tym samym katalogu, w którym znajduje się plik maszynopisu. Oto pełny przykład pliku routingu express node.js, który zakłada, że ​​node.d.ts znajduje się w tym samym katalogu:

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

Mogę następnie utworzyć kontroler SheetController i (używając ekspresu) przypisać metodę widoku:

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

Przypuszczam, że każde słowo kluczowe można zmienić za pomocą tego wzorca:

declare var reservedkeyword: any;
(reservedkeyword).anything = something;
Daniel Flower
źródło
2

Jest brzydki i zepsuty, ale nadal możesz:

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

Które kompiluje się w:

var Greeter = (function () {
    function Greeter() { }
    return Greeter;
})();
exports = Greeter;
Peter Burns
źródło
1
Niestety, wydaje się, że kompilator TypeScript nie radzi sobie z tym dobrze. Na przykład nie możesz wywodzić się z klasy, kiedy to robisz.
dcstraw
jak by to działało? Czy to nie jest cały argument przeciwko CommonJs kontra AMD. That Common nie obsługuje zwracania rzeczy bezpośrednio jako zmienna eksportu?
George Mauer