2016-06-15 17 views
0

これはマニュアルには含まれていないようです。継承されたクラスのネームスペースでのインターフェイスの宣言のマージ

別名だが継承されたクラスのネームスペース内の同じ名前のインターフェイスがマージされないのはなぜか分かります。以下の例では、2番目のインターフェイスがマージされずに最初のインターフェイスをシャドウしています。継承された名前空間のメンバーが表示されるので、私の勘はインターフェースがマージされると考えていました。明示的にBar.IOptionsを宣言してFoo.IOptionsを拡張することができますが、現在の動作が意図されているかどうかは疑問です。

class Foo { 
    constructor(options: Foo.IOptions = {}) { 
     this._a = options.a || 0; 
    } 
    private _a: number; 
} 


namespace Foo { 
    export interface IOptions { 
     a?: number; 
    } 

    export const c = 12; 
} 


class Bar extends Foo { 
    constructor(options: Bar.IOptions) { 
     super(); 
     this._b = options.b; // okay 
     this._c = Bar.c;  // okay, inherited from Foo 
     this._a2 = options.a; // fail 
    } 

    private _b: string; 
    private _c: number; 
    private _a2: number; 
} 


namespace Bar { 
    export interface IOptions { 
     b?: string; 
    } 
} 

答えて

1

完全修飾名が異なる-1はFoo.IOptionsであり、他はBar.IOptionsであるためです。また

namespace Foo { 
    export interface IOptions { 
     a?: number; 
    } 
} 

namespace Foo { 
    export interface IOptions { 
     b?: string; 
    } 
} 

var options: Foo.IOptions = {}; 
options.a; // works 
options.b; // works 

FooBarのコンストラクタはさまざまなタイプを取ることを実現し、:彼らは同じ完全修飾名を持っている場合、宣言のみマージすることを

注意が発生します。 ...

あなたはFooタイプBar.IOptionsのオブジェクト渡すことはできません...

class Bar extends Foo { 
    constructor(options: Bar.IOptions) { 
     super(options); // doesn't work 
    } 
} 

を...しかし、あなたはそれをFoo.IOptionsであるオブジェクトを渡すことができます:FooFoo.IOptionsかかり、BarBar.IOptions取り

class Bar extends Foo { 
    constructor(options: Bar.IOptions) { 
     super({ a: 5 }); // works 
    } 
} 
関連する問題