node.js - NodeJS, TypeScript og typescript-collections


Jeg forsøger at bruge Dictionary-klassen fra typescript-collections inden for 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));
    }
}

Men jeg bliver ved med at få følgende fejl på new Dictionary:

TypeError: undefined is not a function

Er der nogen, der ved, hvad der foregår her? Jeg er også helt fint med at erstatte det med et bedre fungerende TS collections-bibliotek...

Svar #1

Du har et problem med interne vs. eksterne moduler.

TypeScript Collections-biblioteket er skrevet som et internt modul -- en standard JavaScript-fil, som du bare kunne smide ind i et script-tag på en webside.

Node's require forventer dog en CommonJS-kompatibel fil, der vil tildele noget til exports, med andre ord et eksternt modul. Hvad der sker, er, at node.js finder collections.js, udfører det og returnerer dig tilbage exports-objektet fra evalueringen af filen. Fordi det bare er en almindelig JS-fil, er det eksporterede objekt {} -- tomt.

Den bedste løsning ville være:

  1. Erstat din reference til collections.ts med en til collections.d.ts, blot for at være korrekt (kør tsc --d collection.ts for at generere denne fil)
  2. Brug en løsning til at indlæse "vanilla" JS-filer i node. En god one-liner (fra det linkede spørgsmål) er eval(require('fs').readFileSync('./path/to/file.js', 'utf8'));