module.exports in Typoskript

85

weiß jemand, wie man ein module.exports macht?

Ich habe verschiedene Wege ausprobiert

export class Greeter {}

was kompilieren wird

exports.Greeter = Greeter;

Aber was ich wirklich will, ist Folgendes:

exports = Greeter;

Damit ich es so benutzen kann:

import { Greeter } from "greeter";

const greeter = new Greeter();

und nicht

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();

Ist das mit Typescript möglich?

Kersten
quelle

Antworten:

78

Sie können eine einzelne Klasse in TypeScript folgendermaßen exportieren:

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;

Und so wird es verwendet:

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

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

console.log(name); // Homer Simpson

Um vollständig zu sein, hier ist meine tsconfig.json (ich verwende TypeScript v2.0.3):

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist/commonjs",
    "rootDir": "src/ts",
    "target": "es5"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}
Benny Neugebauer
quelle
Vielen Dank! Ich frage mich, warum Typoskript keine Exportperson implementiert hat ... bla bla bla? Ich denke es wäre logisch, nein? oder mir fehlt etwas
Arsen Mkrtchyan
1
Könnte es möglich sein, noch einige Eingaben aus der Datei zu exportieren? Möglicherweise möchten Sie Eingaben aus der Datei abrufen, um Tests zu schreiben, möchten aber module.exportsam Ende immer noch eine .
Eric Burel
21

Dies wurde nun implementiert und ist in TypeScript 0.9 fertig :)

Kersten
quelle
10
Zur Verdeutlichung (da ich das ausgraben musste) ist die Syntax in 0.9 hier verfügbar: blogs.msdn.com/b/typescript/archive/2013/06/18/… (unter "Export =").
Dan
3
Und zur weiteren Verdeutlichung wurde es für zukünftige Leser FAST genau so implementiert , wie es der Fragesteller wünschte. . . Aber was ich wirklich will ist export = Greeter; , genau das machst du :)
Binary Worrier
1
Ich wollte nur ein config/db.tsKonfigurationsobjekt aus verfügbar machen und diese Konfiguration in der App verwenden. Dies ist, was ich erfolgreich in TypeScript 1.4 tun konnte: In config/db.tsSchreiben var config = {connStr:'postgres://user:pass@host/dbname'}; export = config;und app.tsVerweisen alsimport dbConfig = require('./config/db'); dbConnect(dbConfig.connStr);
Gurjeet Singh
10

Ich glaube, ich habe eine Problemumgehung gefunden. Schließen Sie einfach das Schlüsselwort 'module' in Ihre .ts-Datei in Klammern ein:

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

Die generierte Javascript-Datei ist genau dieselbe:

(module).exports = MyClass;

Beachten Sie, dass Sie die Definitionsdatei node.d.ts besser herunterladen als das var-Modul selbst deklarieren und im selben Verzeichnis wie Ihre Typoskriptdatei ablegen müssen . Hier ist ein vollständiges Beispiel einer Express-Routingdatei von node.js, die davon ausgeht, dass sich node.d.ts im selben Verzeichnis befindet:

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

Ich kann dann einen SheetController neu einrichten und (mit Express) die Ansichtsmethode zuweisen:

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

Ich nehme an, dass jedes Schlüsselwort mit diesem Muster maskiert werden kann:

declare var reservedkeyword: any;
(reservedkeyword).anything = something;
Daniel Flower
quelle
2

Es ist hässlich und hackig, aber Sie können immer noch tun:

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

Welche kompiliert in:

var Greeter = (function () {
    function Greeter() { }
    return Greeter;
})();
exports = Greeter;
Peter Burns
quelle
1
Leider scheint der TypeScript-Compiler damit nicht gut umzugehen. Zum Beispiel können Sie nicht von der Klasse ableiten, wenn Sie dies tun.
DCstraw
Wie würde das funktionieren? Ist das nicht das ganze Argument mit CommonJs vs. AMD? Dass Common die direkte Rückgabe von Daten als Exportvariable nicht unterstützt?
George Mauer