2016-07-29 13 views
2

definiert wurde. Seit einiger Zeit versuche ich, die Klassen aus einer kleinen Bibliothek, die ich geschrieben habe, an einem einzigen Ort zu exportieren. Ich möchte, dass jede Klasse unabhängig davon ist, wie sie nach außen verfügbar gemacht wird, aber ich kann das bisher nicht schaffen.Eine TypeScript-Klasse aus einer anderen Datei exportieren, als sie in

Nehmen wir an, ich habe die Klasse Foo

// lib/foo.ts 
export class Foo {} 

und die Klasse Bar

// lib/bar.ts 
export class Bar {} 

Jetzt will ich diejenigen zur Verfügung stellen, wer nutzt das Paket über den MyModule Namespace und das ist wo es schwierig wird. Ich weiß nicht, wie ich vorhandene Klassen aus einem Namespace exportieren kann, der an einer anderen Stelle als der Klasse selbst definiert ist.

Offensichtlich wird dies nicht funktionieren, weil es nicht gültig Typoskript ist:

// api.ts 
import { Foo } from "./lib/foo"; 
import { Bar } from "./lib/bar"; 

export namespace MyModule { 
    export Foo; 

    export namespace MySubModule { 
     export Bar; 
    } 
} 

ich zwei mögliche Lösungen für diese gefunden haben, aber beide machen ihre Nachteile haben. Ich kann eine Variable definieren und die Klasse zuweisen:

// api.ts 
import { Foo as MyFoo } from "./lib/foo"; 
import { Bar as MyBar } from "./lib/bar"; 

export namespace MyModule { 
    export const Foo = MyFoo; 

    export namespace MySubModule { 
     export const Bar = MyBar; 
    } 
} 

Dies wird in der Tat erlauben Sie mir, wie new MyModule.MySubModule.Bar Instanzen der Klasse von einem externen Ort zu schaffen, sondern gibt mir nicht die Möglichkeit, sie als Typen zu verwenden, da

let myBarInstance: MyModule.MySubModule.Bar; 

ein Typoskript Fehler werfen die besagt, dass

Module "path/to/module/api" .MySubModule hat keine exportierte Mitglied 'Bar'

Andersherum habe ich versucht, export type Bar = MyBar statt const zu verwenden und während dies funktioniert, wenn ich sage

let myBarInstance: MyModule.MySubModule.Bar 

auf der anderen Seite kann ich natürlich nicht MyModule.MySubModule.Bar instanziiert, da es nur eine Art Alias ​​ist.

All dies gilt für die Foo Klasse.

Hat jemand irgendwelche Erfahrung damit, habe ich vielleicht einige andere Exportfunktion übersehen, die TypeScript bietet?

Antwort

1

Also Ryan Cavanaugh aus dem TypeScript-Team war freundlich genug to answer my question über ihre GitHub.

Es ist eigentlich ziemlich einfach: beide Ansätze kombinieren kam ich mit und du bist gut zu gehen:

// api.ts 
import { Foo as MyFoo } from "./lib/foo"; 
import { Bar as MyBar } from "./lib/bar"; 

export namespace MyModule { 
    export const Foo = MyFoo; 
    export type Foo = MyFoo; 

    export namespace MySubModule { 
     export const Bar = MyBar; 
     export type Bar = MyBar; 
    } 
}