Búsqueda de sitios web

node.js - NodeJS, TypeScript y colecciones-de-typescript


Estoy tratando de usar la clase Dictionary de typescript-collections dentro de NodeJS:

/// <reference path="../../../scripts/collections.ts" />
var collections = require('../../../scripts/collections');

export class AsyncProcessorCommand implements interfaces.IAsyncProcessorCommand
{
    public static Type = 'RabbitMon.AsyncProcessorCommand:RabbitMon';
    public GetType = () => 'RabbitMon.AsyncProcessorCommand:RabbitMon';

    public ID: string;

    constructor(public Action: string, public Arguments?: collections.Dictionary<string, string>) {
        this.ID = uuid.v4();

        this.Arguments = new collections.Dictionary<string, string>();
        //I've also tried the following
        //this.Arguments = new collections.Dictionary<string, string>((key: string) => sha1(key));
    }
}

Pero sigo recibiendo el siguiente error en el new Dictionary:

TypeError: undefined is not a function

¿Alguien sabe qué está pasando aquí? También estoy perfectamente dispuesto a sustituir una mejor biblioteca de colecciones TS que funcione...

Respuesta #1

Tienes un problema de módulos internos vs externos.

La biblioteca de colecciones de TypeScript está escrita como un módulo interno, un archivo estándar de JavaScript que podrías simplemente colocar en una etiqueta script en una página web.

El require de Node, sin embargo, espera un archivo compatible con CommonJS que asigne algo a exports, en otras palabras, un módulo externo. Lo que ocurre es que node.js encuentra collections.js, lo ejecuta y te devuelve el objeto exports resultante de evaluar el archivo. Como es solo un archivo JS normal, el objeto exportado es {} -- vacío.

La mejor solución sería:

  1. Reemplace su referencia a collections.ts con una a collections.d.ts, solo por cuestión de corrección (ejecute tsc --d collection.ts para generar este archivo)
  2. Usa alguna solución para cargar archivos JS "vanilla" en Node. Una buena línea única (de la pregunta enlazada) es eval(require('fs').readFileSync('./path/to/file.js', 'utf8'));