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?
Cela a maintenant été implémenté et est prêt dans TypeScript 0.9 :)
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"
]
}
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;
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;