

  * 環境

    * Node.js:8.9.4
    * typescript:2.9.2
  * やりたいこと

    * 名前空間内のクラスをjestやmochaでテストしたい
    * tsconfig.jsonのtargetはES5
    * ソース側は変更したくない
  * 現状の例
[code]     // src/main.ts

    namespace base {
        export class Foo {
            constructor() { console.log("Called Foo Constructor!"); }
            public answerToTheUltimateQuestion(): number { return 42; }
            public callHello() { return new Bar().say() }
        }
    }
    
    // src/Hello.ts
    namespace base {
        export class Bar {
            constructor() { console.log("Called Bar Constructor!"); };
            say(): string { return "hello!"; }
            getFoo() { return new base.Foo(); }
        }
    }
    
    // \__tests__/main.test.ts
    const foo = new base.Foo(); // ReferenceError: base is not defined
    
    test("someMethod", () => {
        expect(foo.answerToTheUltimateQuestion()).toBe(42);
    });
    
[/code]

モジュール形式に書き直すのが一番良いとはわかっているのですが、ファイル数が多く、  
変更しづらい状況なため、どうにかしてまずテストで  
壊れてもわかる状況を確保してから書き直していきたいのです。  
d.tsファイル、tsconfig.jsonのtarget以外の変更、あるいは他の手段で解決することはできるのでしょうか？


CC BY-SA 4.0
2018-07-13T02:28:16.067
45571
2018-07-13T14:29:18.870
12195
question
node.js typescript
namespaceを維持したまま外部モジュールとして他のファイルから読み込むには


本家のstackoverflowに同様の質問がありました。ただし、本家の質問は解決にいたっていません。

[How would I test Typescript code that uses namespaces in
Node.js?](https://stackoverflow.com/questions/43952139/how-would-i-test-
typescript-code-that-uses-namespaces-in-node-js?answertab=active#tab-top)

ただその中で、TypeScriptの`\--outFile` オプションを使う方式が紹介されていました。

以下のようにテストコードに`/// <reference />`で依存関係のあるファイルパスを記載し、  
`outFile`オプションに`main.test.js`などと指定して、  
テストコードと依存コードを1つまとめれば、テストコードの修正と、  
ビルドツールの工夫だけで対応できるかもしれません。

[code]

    // \__tests__/main.test.ts
    /// <reference path="main.ts" />
    /// <reference path="Hello.ts" />
    const foo = new base.Foo(); // ReferenceError: base is not defined
    
    test("someMethod", () => {
        expect(foo.answerToTheUltimateQuestion()).toBe(42);
    });
    
[/code]


CC BY-SA 4.0
2018-07-13T14:29:18.870
45587
2018-07-13T14:29:18.870
45571
answer