111 votes

module.exports dans typescript

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

J'ai essayé différentes méthodes pour aboutir à

export class Greeter {}

qui sera compilé en

exports.Greeter = Greeter;

Mais ce que je veux vraiment, c'est ça :

exports = Greeter;

Pour que je puisse l'utiliser comme ça :

import { Greeter } from "greeter";

const greeter = new Greeter();

et non

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();

Est-ce possible avec Typescript ?

104voto

Benny Neugebauer Points 5393

Vous pouvez exporter une seule classe en 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 il 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"
  ]
}

23voto

Kersten Points 351

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

11voto

chuckj Points 7975

Actuellement non. Il s'agit d'une limitation de TypeScript et d'une limitation de la spécification de module actuellement envisagée par l'ECMA, dont TypeScript s'inspire.

Ce serait une excellente suggestion à faire sur CodePlex.

9voto

Buttle Butkus Points 331

Je pense donc avoir trouvé une solution de contournement. Il suffit de mettre 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;

Remarque, plutôt que de déclarer le module var vous-même, téléchargez le module fichier de définition node.d.ts et le placer dans le même répertoire que votre fichier typescript. Voici un exemple complet d'un fichier de routage node.js express qui suppose que le fichier 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 ensuite créer un SheetController et (à l'aide d'express) affecter 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;

2voto

Peter Burns Points 17420

C'est moche et bidon, mais tu peux toujours le faire :

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

Ce qui se compile en :

var Greeter = (function () {
    function Greeter() { }
    return Greeter;
})();
exports = Greeter;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X