TypeScript の名前空間を使った場合の外部モジュール設定
解決できそうで出来ないので質問させてください。
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 のみの場合の名前空間での分離の実装はできています。
現状で正常に動いているのは次のとおりです。
// 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;
これで、hogeのライブラリがうまく動くところまでつくりました。
なぜhoge_core.ts と hoge.ts を二分割しているかというと、
将来的に hoge_sub.ts を追加したいと思っていたからです。
hoge_sub.ts で次のようにしたところ ts(2339) エラーになります。
// 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;
hoge_sub.ts の hoge.c = のところで、hogeに c プロパティをもっているという型情報が入っていないからだめなようです。
これをうまく行える方法はあるでしょうか?
また、より望ましい形にできたらと思うのは、下記のように書きたいのです。
import した hoge と ローカルの名前空間の hoge を合成したいのですが、名前がぶつかってコンパイルできないと言われます。ts(2440)
// 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;
なんとかなりそうでなんともならなくて困っています。
上記はhogeを使ったサンプルコードですが
具体的にはこちらのコードでライブラリを作成しています。
https://github.com/standard-software/copipejs/tree/master/source
copipe_core.ts に対して
copipe.ts で全体を公開してます。
copipe_sub.ts を追加して動かしたいのですがやり方がわからないということになります。
長い質問になりました。よろしくお願いします。