TypeScript 0.8.2 importerar Node.js-moduler i interna moduler
Okej, som jag kan se skulle du vilja använda interna moduler i ditt projekt. Det fanns faktiskt en lösning i TypeScript 0.8.1.1, du kunde definiera en icke-exporterad modul (intern) och lägga till imports ovanför den. I 0.8.2 verkar det som att detta inte fungerar längre. Det enda alternativ jag ser här skulle vara att helt utelämna import-syntaxen och använda standard require för node-moduler. Jag vet inte om det är en bra idé, men dela gärna era åsikter. Jag vet att användning av import-syntaxen kommer att göra modulen extern (språkspecifikation), men det var inte sant i 0.8.1.1, kanske ett fel?
I TypeScript 0.8.1.1 fungerade detta och fungerar inte längre i 0.8.2:
import path = module('path');
import fs = module('fs');
module SomeNamespace.Controller {
export class Index {
...
}
}
Jag kunde referera filen som inkluderar ovanstående kod med hjälp av referenssyntaxen högst upp i filen i andra interna moduler och normalt kalla:
var ctrl = new SomeNamespace.Controller.Index;
ctrl.index();
Det verkar som att i 0.8.2 är detta det enda sättet som det fungerar för interna moduler:
var path = require('path');
var fs = require('fs');
module SomeNamespace.Controller {
export class Index {
...
}
}
Finns det några andra möjligheter att blanda interna moduler med Node.js-moduler? Är det något fel på ovanstående användning av require (det kompilerar och körs okej ...)?
Svar #1
Jag tycker att TypeScript 0.8.2 tar oss närmare specifikationen.
Syntaxen:
import x = module('SomeModule');
Är specifikt ett ExternalModuleReference i TypeScript-språkspecifikationen.
En intern modul skulle importeras med:
///<reference path="SomeModule.ts" />
import x = SomeModule;
Men att importera en intern modul kommer inte att generera en require-sats i ditt JavaScript.
Tagen från TypeScript Språkspecifikation 0.8 - 9.2.2 Importdeklarationer
Importdeklaration:
import Identifier = ModuleReference ;
Modulreferens:
ExternalModuleReference
ModuleName
ExterntModulReferens:
module ( StringLiteral )
Svar #2
Okej, detta fel beror på versionen av TypeScript. I TypeScript 0.8.1.1 för att importera ett externt modul måste syntaxen vara:
export import <moduleName> = module(“<path>”);
Detta är en bugg som identifierats i den senaste versionen av TypeScript, du kan återgå till den tidigare versionen eller ändra syntaxen för att göra den kompatibel med v0.8.1.1. Ha i åtanke att detta är en bugg och att du i framtida versioner bör kunna använda den ursprungliga syntaxen.
Detta är den officiella tråden för denna bugg: http://typescript.codeplex.com/discussions/405800
