TypeScript에서 중첩 클래스를 만들 수 있습니까?


답변:


131

TypeScript 1.6부터 클래스 표현식이 있습니다 ( 참조 ).

즉, 다음을 수행 할 수 있습니다.

class Foo {
    static Bar = class {

    }
}

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

1
이 예제는 Typescript 1.6.3에서 작동하지 않습니다. 오류 TS4028 내 보낸 클래스의 공용 정적 속성 'Bar'에 개인 이름 '(익명 클래스)'가 있거나 사용 중입니다.
Sergey

1
@Sergey 나는 같은 문제가 있었으므로 아래 내 대답에 따라 네임 스페이스를 사용하기 시작했습니다.
댄 데프

클래스 내부에 인터페이스를 만드는 방법이 있습니까? 즉, Bar가 인터페이스가되기를 원하는 경우
RoG

@LittaHervi-하나의 사용 사례는 예를 들어 팩토리 메서드에서 외부 인터페이스의 비공개 구현을 반환하는 것입니다. Java (및 기타)의 또 다른 예는 포함하는 클래스의 멤버 변수에 대한 권한있는 액세스를 필요로하고 범위 지정 규칙을 통해 자동으로 수행해야하는 반복기입니다.
Dave

30

다음은 클래스 표현식을 사용하는 더 복잡한 사용 사례 입니다.

내부 클래스외부 클래스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());

코드 펜


3
@RyanCavanaugh "내부"클래스 표현식 내부의 비공개 멤버에 액세스하는 기능이 버그입니까?
bnieland

5
TypeScript 팀에서 이것이 올바른 사용법인지 확인했습니다. github.com/Microsoft/TypeScript/issues/…
bnieland

1
이것을 직접 전달하지 않고 부모 컨텍스트에 액세스 할 수 있습니까?
shabunc

내 지식이 아닌 @shabunc
bnieland

1
정확히 내가 찾던 것, 감사합니다!
Philippe

19

컴파일 오류가 발생하지 않고 내 보낸 클래스와 함께 작동하도록 할 수 없었고 대신 네임 스페이스를 사용했습니다 .

namespace MyNamespace {
    export class Foo { }
}

namespace MyNamespace.Foo {
    export class Bar { }
}

같은. 'Foo'는 유형 만 참조하지만 여기서는 네임 스페이스로 사용됩니다.
Will Beason 19:51에

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.