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?

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

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


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;

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;

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.