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:
- Erstat din reference til
collections.tsmed en tilcollections.d.ts, blot for at være korrekt (kørtsc --d collection.tsfor at generere denne fil) - 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'));