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?

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

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


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;

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;

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.