2016-10-01 22 views
5

można pomyślnie zadeklarować zagnieżdżonych klasy tak:Odwoływanie wewnętrzne zajęcia w maszynopisie

class Outer { 
    static Inner = class Inner { 

    }; 
} 

Jednak chciałbym moją zewnętrzną klasę posiadać kilka wystąpień mojego wewnętrznego Klasa:

class Outer { 
    constructor() { 
     this.inners = [new Outer.Inner()]; 
    } 
    static Inner = class Inner { 

    }; 

    inners: Array<Inner>; // this line errors 
} 

Ale this gives meerror TS2304: Cannot find name 'Inner'.

Jak mogę to ułatwić?

+0

Możliwy duplikat [Can tworzysz zagnieżdżone klasy w TypeScript?] (http://stackoverflow.com/questions/32494174/can-you-create-nested-classes-in-typescript) –

+0

Nie duplikat - to z powodzeniem tworzy klasę zagnieżdżoną, ale problem jest z utworzeniem członka, który ma zagnieżdżony typ klasy. – Eric

+0

Zarówno pytanie, jak i zaakceptowana odpowiedź pokazują, jak odwołać się do typu wewnętrznego: 'var bar = new Foo.Bar();'. –

Odpowiedz

1

Nie wiem, może to być osiągnięte w ten sposób jednak, jako obejście:

class Outer { 
    inners: Array<Outer.Inner>; 
} 

namespace Outer { 
    export class Inner { 
    } 
} 

Uwaga: klasa muszą być zdefiniowane przed nazw

Zobacz in action

+0

Czy to oznacza, że ​​konstruktor klasy nie może odwoływać się do 'Outer.Inner'? – Eric

+0

Tak. Sądzę, że dzieje się tak dlatego, że klasa Inner jest zdefiniowana poza (po) konstruktorem, gdzie w wewnętrznym konstruktorze zdefiniowane są właściwości takie jak "wewnętrzny". Zobacz [skompilowany skrypt javascript] (https://www.typescriptlang.org/play/#src=%0D%0Aclass%20Outer%20%7B%0D%0A%0D%0A%20%20%20%20static%20Inner % 20% 3D% 20klasa% 20Innera% 20% 7B% 0D% 0A% 0D% 0A% 20% 20% 20% 20% 7D% 3B% 20% 2F% 2Foutside% 20the 20konstruktor% 0D% 0A% 0D% 0A % 20% 20% 20% 20astring% 3A% 20 łańcuch% 20% 3D% 20% 22określony% 20następny% 20the 20konstruktor% 22% 0D% 0A% 0D% 0A% 20% 20% 20% 20 uczestników% 3A% 20Array% 3COuter .Inner% 3E% 3B% 20% 2F% 2F% 20this% 20line% 20errors% 0D% 0A% 7D) –

+0

'Zewnętrzna'var nie jest jeszcze zdefiniowana (wewnątrz konstruktora). –