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?

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"
  ]
}

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 :)


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;

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;

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.