2017-01-11 10 views
2

複数のメンバーを持つオブジェクトをエクスポートするノードモジュールの形状を記述する宣言ファイルがあります。このファイルは、foo/index.d.tsに存在し、次のようになります。既存のTypescript宣言モジュールの内部メンバーをエクスポートする方法

これにより
interface Foo { 
    bar:() => void; 
    // ... more members here 
} 


declare var Foo: Foo; 
export = Foo; 

、コンパイルするとき、私は通常のように、モジュールを必要とし、使用することができます。

import * as Foo from 'foo'; 
Foo.bar(); 

をしかし、私は今もこれを行うことができるようにしたいです:

import * as bar from 'foo/bar'; 
bar(); 

私は宣言ファイルパス、モジュール、名前空間、およびコンテキストのすべての組み合わせを試してみたが、私はこの作業を取得することはできません。

import * as Foo from '..'; 
export = Foo.bar; 

しかし、これはエラーになりやって:最も明白な、直感的な方法はとfoo/bar/index.d.tsでファイルを作成することです'Foo' only refers to a type, but is being used as a namespace here.

は、どのように私は両方の外側のエクスポートモジュールを定義宣言ファイルを作成することができますし、内部のメンバーですか?

編集は:@cevekにより示唆されるようdeclare moduleを使用しようとしましたが、これは "名前空間Fooのが見つかりません" というエラーがスローされます。

declare module "foo/bar" { 
    var bar: Foo.bar; 
    export = bar; 
} 
+0

なぜあなたは ' "foo"から{bar}をインポートする; '?達成したいことは、ハックのように見えます。 –

+0

どちらの部分? 'export ='は最低限必要です。これは 'module.exports ='(https://www.typescriptlang.org/docs/handbook/modules.html)を持つノードモジュールを記述しているので、標準的なハンドリング方法ですTSでこれ。もしそれが他のものなら、私は間違いなく少なくともハッキーなやり方でやっています。 – Andrew

+0

私は 'foo/bar ';'から 'import *の代わりにバーを使用しています。私はあなたのユースケースがそれを許すかどうかわかりません。基本的には、標準のES6モジュールの機能を使用して、外部の型情報が必要なモジュール宣言を使用します( 'exports =' no)。 –

答えて

0

あなたはモジュール宣言を使用することができます

//foo.d.ts 
    interface Foo {} 
    interface Bar {} 

    declare module 'foo' { 
     export default Foo 
    } 

    declare module 'foo/bar'{ 
     export default Bar 
    } 

そして、別の場所から使用してください

import * as Foo from 'foo'; 
import * as Bar from 'foo/bar'; 
+0

これで、 "名前空間Fooを見つけることができませんでした"という結果になりました(編集として投稿されました) – Andrew

+0

@Andrew使用しているタイスクリプトのバージョンは? – cevek

+0

バージョン2.1.3 – Andrew

関連する問題