module.exports en mecanografiado

84

¿Alguien sabe cómo hacer un module.exports?

Intenté algunas formas diferentes para terminar con

export class Greeter {}

que se compilará para

exports.Greeter = Greeter;

Pero lo que realmente quiero es esto:

exports = Greeter;

Para que pueda usarlo así:

import { Greeter } from "greeter";

const greeter = new Greeter();

y no

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();

¿Es esto posible con TypeScript?

Kersten
fuente

Respuestas:

77

Puede exportar una sola clase en TypeScript de esta manera:

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;

Y así es como se utilizará:

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

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

console.log(name); // Homer Simpson

Para completar, aquí está mi tsconfig.json (estoy usando TypeScript v2.0.3):

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist/commonjs",
    "rootDir": "src/ts",
    "target": "es5"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}
Benny Neugebauer
fuente
¡Muchas gracias! Me pregunto por qué el mecanografiado no ha implementado export Person ... bla bla bla? Creo que sería lógico, ¿no? o me falta algo?
Arsen Mkrtchyan
1
¿Podría ser posible seguir exportando algunas mecanografías del archivo también? Es posible que desee obtener mecanografía del archivo para escribir pruebas, pero aún así desea un module.exportsal final.
Eric Burel
21

Esto ahora se ha implementado y está listo en TypeScript 0.9 :)

Kersten
fuente
10
Para aclarar (ya que tuve que investigar esto), la sintaxis en 0.9 está disponible aquí: blogs.msdn.com/b/typescript/archive/2013/06/18/… (en "Export =").
Dan
3
Y para una mayor aclaración, para los futuros lectores, se ha implementado CASI exactamente como lo deseaba el solicitante. . . Pero lo que realmente quiero es export = Greeter; , eso es exactamente lo que haces :)
Binary Worrier
1
Solo quería exponer un objeto de configuración config/db.tsy usar esa configuración en la aplicación. Esto es lo que pude hacer con éxito en TypeScript 1.4: En config/db.tsescritura var config = {connStr:'postgres://user:pass@host/dbname'}; export = config;y en app.tsreferirlo comoimport dbConfig = require('./config/db'); dbConnect(dbConfig.connStr);
Gurjeet Singh
10

Así que creo que encontré una solución. Simplemente coloque la palabra clave 'módulo' entre paréntesis en su archivo .ts:

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

El archivo javascript generado será exactamente el mismo:

(module).exports = MyClass;

Tenga en cuenta que, mejor que declarar el módulo var usted mismo, descargue el archivo de definición node.d.ts y péguelo en el mismo directorio que su archivo mecanografiado. Aquí hay una muestra completa de un archivo de enrutamiento express node.js que asume que node.d.ts está en el mismo directorio:

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

Luego puedo crear un SheetController y (usando express) asignar el método de vista:

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

Supongo que cualquier palabra clave se puede escapar usando este patrón:

declare var reservedkeyword: any;
(reservedkeyword).anything = something;
Daniel Flor
fuente
2

Es feo y hacky, pero aún puedes hacer:

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

Que se compila en:

var Greeter = (function () {
    function Greeter() { }
    return Greeter;
})();
exports = Greeter;
Peter Burns
fuente
1
Desafortunadamente, el compilador de TypeScript no parece manejar esto bien. Por ejemplo, no puede derivar de la clase cuando hace esto.
dcstraw
¿Cómo funcionaría esto? ¿No es ese todo el argumento con CommonJs vs. AMD? ¿Que Common no admite la devolución de material directamente como variable de exportación?
George Mauer