2017-10-02 2 views
1

Javascriptプロジェクトの入力を定義したいと思います。のは、単純化されたバージョンを考えてみましょう:typescript型定義ネストされたネームスペースとインターフェイス

a 
| 
+ A.js 
+ b 
    | 
    + B.js 

フォルダ「」、およびその内部に存在したフォルダ「b」があり、私のようにそれを使用したいがあります:

import { A } from "a" 
import { B } from "a/b" 

ことタイピング

declare namespace a { 
    interface A { } 

    namespace b { 
     interface B { } 
    } 
} 

declare module "a" { 
    export = a 
} 

declare module "a/b" { 
    export = a.b 
} 

しかし、これは私にエラーCannot use namespace 'a' as a valueを与える:私は、理想的にはこのようなもののようなルックスを持っていると思います。

インターフェイスをクラスに変更すると、問題が解決したことに気付きました。誰かがそれがなぜそうなのか、いくつかの光を発することができますか?そのような定義をインターフェースで得る方法はありますか?

答えて

2

https://github.com/Microsoft/TypeScript/issues/17530

は値や文が含まれていない名前空間は、インスタンス生成の名前空間と見なされ、何のランタイム値を持っていません。

あなたが行うことで、エラーを防ぐことができます。名前空間がaa.bが実際に実行時にグローバルとして用意されていない限り、

declare module "a/b" { 
    import b = a.b 
    export = b 
} 

をただし、あなたが書く必要があります。

declare module "a" { 
    export interface A { 
     foo: string 
    } 
} 

declare module "a/b" { 
    import {A} from 'a' 
    export interface B { 
     bar: A 
    } 
} 
+0

あなたは何をすべきか「名前空間aとabが実行時に実際にグローバルとして利用可能でない限り」という意味ですか? – Wickoo

+1

@Wickooつまり、 'setTimeout'のように、それらをインポートすることなくアクセスできます –

関連する問題