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

Relaterade artiklar