web-dev-qa-db-fra.com

module.exports en dactylographié

quelqu'un sait-il comment faire un module.exports?

J'ai essayé de différentes manières en me retrouvant

export class Greeter {}

qui compilera à

exports.Greeter = Greeter;

Mais ce que je veux vraiment, c'est ceci:

exports = Greeter;

Pour que je puisse l'utiliser comme ça:

import { Greeter } from "greeter";

const greeter = new Greeter();

et pas

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();

Est-ce possible avec Typescript?

68
Kersten

Cela a maintenant été implémenté et est prêt dans TypeScript 0.9 :)

20
Kersten

Vous pouvez exporter une seule classe dans TypeScript comme ceci:

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;

Et voici comment cela va être utilisé:

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

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

console.log(name); // Homer Simpson

Pour être complet, voici mon tsconfig.json (J'utilise TypeScript v2.0.3):

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist/commonjs",
    "rootDir": "src/ts",
    "target": "es5"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}
63
Benny Neugebauer

Donc, je pense avoir trouvé une solution de contournement. Enveloppez simplement le mot clé 'module' entre parenthèses dans votre fichier .ts:

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

Le fichier javascript généré sera exactement le même:

(module).exports = MyClass;

Notez que mieux que de déclarer le module var vous-même, téléchargez le fichier fichier de définition node.d.ts et collez-le dans le même répertoire que votre fichier TypeScript. Voici un exemple complet d'un fichier de routage express node.js qui suppose que node.d.ts se trouve dans le même répertoire:

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

Je peux alors créer un nouveau SheetController et (en utilisant express) assigner la méthode de vue:

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

Je suppose que n'importe quel mot clé peut être échappé en utilisant ce modèle:

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

C'est moche et hacky, mais vous pouvez toujours faire:

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

Qui compile en:

var Greeter = (function () {
    function Greeter() { }
    return Greeter;
})();
exports = Greeter;
2
Peter Burns