2016-07-29 4 views
2

しばらくの間、小さなライブラリからクラスをエクスポートしようとしていましたが、一箇所に書きました。私は各クラスが外部に利用可能にされる方法には無関係であることを望みますが、これまでに働くことはできません。TypeScriptクラスを別のファイルからエクスポートしました。

のは、私はクラスFoo

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

Bar

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

は、今私はMyModule名前空間を経由して、パッケージを使用しています誰に利用可能なものを作りたいクラスを持っていると仮定しましょう、これはありますどこが厄介なのか。クラス自体とは別の場所で定義されている名前空間から既存のクラスをエクスポートする方法はわかりません。それが有効な活字体ではないので

明らかに、これは動作しません。

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

export namespace MyModule { 
    export Foo; 

    export namespace MySubModule { 
     export Bar; 
    } 
} 

を、私はこれには2つの潜在的な解決策を発見したが、両方が自分の欠点を持っています。私は、変数を定義し、それにクラスを割り当てることができます。

// 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; 
    } 
} 

私はnew MyModule.MySubModule.Barのような外部の場所からクラスのインスタンスを作成することができますが、私のタイプとして、それらを使用する可能性を与えることはありません実際には、この意志

以来
let myBarInstance: MyModule.MySubModule.Bar; 

は.MySubModuleが

をなしエクスポートメンバー 'バー' を持っている

モジュール "パス/に/モジュール/ API" という内容の活字体のエラーがスローされます

他の方法で回避、私が代わりにconstexport type Bar = MyBarを使用しようとした一方で

let myBarInstance: MyModule.MySubModule.Bar 

を言ったときに、これは動作しますが、それは単なるタイプの別名だから、私は自然にMyModule.MySubModule.Barをインスタンス化することはできません。

これはすべてFooクラスの場合と同じです。

誰もこれについて何か経験がありますか?TypeScriptが提供している他のエクスポート機能を見落としたことがありますか?

答えて

1

したがって、TypeScriptチームのRyan CavanaughはGitHubで十分にto answer my questionでした。

それは実際にはかなり簡単です:ちょうど私が思いついたとあなたが行ってもいいですアプローチの両方を兼ね備え:

// 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; 
    } 
} 
関連する問題