

Typescriptで以下のような定義をすると、

[code]

    class A {
      public b: A.B
    }
    
    namespace A {
      class B {
      }
    }
    
[/code]

classAの定義で

`[ts] 名前空間 'A' にエクスポートされたメンバー 'B' がありません。`

と怒られるし、定義順を逆にするとclassBの定義で

`[ts] 名前空間宣言は、それとマージするクラスや関数より前に配置できません。`

と怒られるのですが、いい解決方法はありますか？


CC BY-SA 4.0
2018-10-14T12:12:48.837
49272
2019-06-29T09:05:19.363
2019-06-29T09:05:19.363
9008
427
question
typescript 循環参照
TypeScriptで循環参照する定義を書く方法


当然ですが `B` を `export` すればエラーにはなりません。

[code]

    class A {
        b: A.B
    
        constructor() {
            this.b = new A.B()
        }
    }
    
    namespace A {
        export class B {
            n = 123
        }
    }
    
[/code]

`B` を外部に露出したくないのだと思うのですが、その場合どうすればよいかは解りません。案として、`private static` な変数にクラス `B`
を保持させ、宣言部でそれを使って初期化する方法を出しておきます。

[code]

    class A {
        private static B = class B {
            n = 123
        }
        b = new A.B()
    }
    
[/code]


CC BY-SA 4.0
2018-10-14T17:12:26.950
49275
2018-10-14T17:12:26.950
3054
49272
answer