TypeScriptでネストされたクラスを作成できますか?


回答:


132

TypeScript 1.6以降、クラス式があります(参照)。

これは、次のことができることを意味します。

class Foo {
    static Bar = class {

    }
}

// works!
var foo = new Foo();
var bar = new Foo.Bar();

1
この例はTypescript1.6.3では機能しません:エラーTS4028エクスポートされたクラスのパブリック静的プロパティ 'Bar'は、プライベート名 '(匿名クラス)'を持っているか使用しています。
セルゲイ

1
@Sergey私は同じ問題を抱えていたので、以下の私の答えに従って名前空間を使い始めました。
ダンデフ

クラス内にインターフェースを作成する方法はありますか?つまり、バーをインターフェースにしたい場合
RoG 2018年

@ LittaHervi-1つのユースケースは、たとえばファクトリメソッドから外部インターフェイスのプライベート実装を返すことです。Java(およびその他)のもう1つの例は、含まれているクラスのメンバー変数への特権アクセスを必要とし、スコープルールを介して自動的にそうするイテレーターですが、これらを直接エクスポートしてインスタンス化することは絶対に避けてください。
デイブ

35

これは、クラス式を使用したより複雑なユースケースです。

これにより、内部クラスprivate外部クラスのメンバーにアクセスできるようになります

class classX { 
    private y: number = 0; 

    public getY(): number { return this.y; }

    public utilities = new class {
        constructor(public superThis: classX) {
        }
        public testSetOuterPrivate(target: number) {
            this.superThis.y = target;
        }
    }(this);    
}

const x1: classX = new classX();
alert(x1.getY());

x1.utilities.testSetOuterPrivate(4);
alert(x1.getY());

codepen


3
@RyanCavanaugh「内部」クラス式内のプライベートメンバーにアクセスする機能はバグですか?
bnieland 2017

5
TypeScriptチームでこれが正しい使用法であることを確認しました。 github.com/Microsoft/TypeScript/issues/...
bnieland

1
これを直接渡さずに親コンテキストにアクセスすることは可能ですか?
shabunc

ではない私の知識に@shabunc
bnieland

19

コンパイルエラーを受け取らずにエクスポートされたクラスでこれを機能させることはできませんでしたが、代わりに名前空間を使用しました:

namespace MyNamespace {
    export class Foo { }
}

namespace MyNamespace.Foo {
    export class Bar { }
}

同じ。「Foo」は型のみを指しますが、ここでは名前空間として使用されています。
ウィル・ビーソン

12

型宣言ファイルのコンテキストにいる場合は、クラスと名前空間を混合することでこれを行うことができます。

// foo.d.ts
declare class Foo {
  constructor();
  fooMethod(): any;
}

declare namespace Foo {
  class Bar {
    constructor();
    barMethod(): any;
  }
}

// ...elsewhere
const foo = new Foo();
const bar = new Foo.Bar();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.