node.js - NodeJS, TypeScript og typescript-collections
Jeg prøver å bruke Dictionary-klassen fra typescript-collections innenfor 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 får stadig følgende feil på new Dictionary:
TypeError: undefined is not a function
Er det noen som vet hva som foregår her? Jeg er også helt villig til å bytte til et bedre fungerende TypeScript-samlingsbibliotek...
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 kan kaste inn i en script-tag i en nettside.
Node's require forventer derimot en fil som er kompatibel med CommonJS, som vil tilordne noe til exports, med andre ord et eksternt modul. Det som skjer er at node.js finner collections.js, kjører den, og returnerer deg exports-objektet fra evalueringen av filen. Siden det bare er en vanlig JS-fil, er det eksporterte objektet {} -- tomt.
Den beste løsningen vil være:
- Erstatt referansen din til
collections.tsmed en tilcollections.d.ts, bare for korrekthetens skyld (kjørtsc --d collection.tsfor å generere denne filen) - Bruk en løsning for å laste "vanilla" JS-filer i Node. En god en-liner (fra det lenkede spørsmålet) er
eval(require('fs').readFileSync('./path/to/file.js', 'utf8'));