54073


解決できそうで出来ないので質問させてください。

JSのライブラリとして提供するものを TypeScript でつくっています。

ライブラリ内部でファイル分割したいのですが  
import したオブジェクト(名前空間?)に対して ts(2339) で型定義できないからと怒られてビルドできません。

次のようなことを行いたいと思っています。

hogeライブラリを使う場合には次のように動いてほしい。  
import hoge from 'hoge';  
hoge.a.aa();  
hoge.a.ab();  
hoge.b.ba();  
hoge.b.bb();  
hoge.c.ca();  
hoge.c.cb();

この hoge を作るときに、hogeの内部でモジュールを分割したいと思っています。

hoge.a と hoge.b は、hoge_core.ts 側で実装し、  
hoge.c は hoge_sub.ts で実装したいのです。

hoge_core.ts のみの場合の名前空間での分離の実装はできています。

現状で正常に動いているのは次のとおりです。

[code]

    // hoge_core.ts
    namespace hoge {
      namespace a {
        export const aa = () = { //処理 };
        export const ab = () = { //処理 };
      }
      namespace b {
        export const aa = () = { //処理 };
        export const ab = () = { //処理 };
      }
    }
    export = hoge;
    
    // hoge.ts
    import hoge = require('./hoge');
    export = hoge;
    
[/code]

これで、hogeのライブラリがうまく動くところまでつくりました。

なぜhoge_core.ts と hoge.ts を二分割しているかというと、  
将来的に hoge_sub.ts を追加したいと思っていたからです。

hoge_sub.ts で次のようにしたところ ts(2339) エラーになります。

[code]

    // hoge_core.ts
    // そのまま
    
    // hoge_sub.ts
    import hoge = require('./hoge_core');
    hoge.c = {
      ca: () => 'test c.ca',
      cb: () => 'test c.cb',
    };
    export = hoge;
    
    // hoge.ts
    import hoge = require('./hoge_sub');
    export = hoge;
    
[/code]

hoge_sub.ts の hoge.c = のところで、hogeに c プロパティをもっているという型情報が入っていないからだめなようです。

これをうまく行える方法はあるでしょうか？

また、より望ましい形にできたらと思うのは、下記のように書きたいのです。  
import した hoge と ローカルの名前空間の hoge を合成したいのですが、名前がぶつかってコンパイルできないと言われます。ts(2440)

[code]

    // hoge_sub.ts
    import hoge = require('./hoge_core');
    namespace hoge {
      namespace c {
        export const ca = () = { //処理 };
        export const cb = () = { //処理 };
      }
    }
    export = hoge;
    
    // hoge.ts
    import hoge = require('./hoge_sub');
    export = hoge;
    
[/code]

なんとかなりそうでなんともならなくて困っています。  
上記はhogeを使ったサンプルコードですが

具体的にはこちらのコードでライブラリを作成しています。

<https://github.com/standard-software/copipejs/tree/master/source>  
copipe_core.ts に対して  
copipe.ts で全体を公開してます。  
copipe_sub.ts を追加して動かしたいのですがやり方がわからないということになります。

長い質問になりました。よろしくお願いします。


CC BY-SA 4.0
2019-04-10T15:33:15.443
54071
2019-04-11T21:30:57.350
2019-04-11T21:30:57.350
9796
21047
question
javascript typescript
TypeScript の名前空間を使った場合の外部モジュール設定


自己レスです。このようにしたら解決しました。  
これでライブラリを拡張して作成していけそうです。

[code]

    // hoge_core.ts
    // そのまま
    
    // hoge_sub.ts
    import hoge_core = require('./hoge_core');
    
    const hoge: any = hoge_core;
    hoge.c = {
      ca: () => 'test c.ca',
      cb: () => 'test c.cb',
    };
    export = hoge;
    
    // hoge.ts
    import hoge = require('./hoge_sub');
    export = hoge;
    
[/code]

一度、any型に代入すればよかったのですね。

また、もうひとつの方のnamespaceの合算系もこのようにするとできました。

[code]

    // hoge_core.ts
    // そのまま
    
    // hoge_sub.ts
    import hoge_core = require('./hoge_core');
    
    namespace hoge {
      // ここで hoge_core オブジェクトの中身を
      // このファイルの hoge に展開する
      export const { a, b } = hoge_core;
    
      export namespace c {
        export const ca = () = { //処理 };
        export const cb = () = { //処理 };
      }
    }
    export = hoge;
    
    // hoge.ts
    import hoge = require('./hoge_sub');
    export = hoge;
    
[/code]

新しい名前空間で公開されているものを取り込む感じです。


CC BY-SA 4.0
2019-04-10T17:31:53.073
54073
2019-04-10T17:31:53.073
21047
54071
answer