Подтвердить что ты не робот

Можете ли вы создать вложенные классы в TypeScript?

Есть ли способ вставить классы в TypeScript. Например. Я хотел бы использовать их как:

var foo = new Foo();
var bar = new Foo.Bar();
4b9b3361

Ответ 1

Начиная с TypeScript 1.6 у нас есть выражения класса (ссылка).

Это означает, что вы можете сделать следующее:

class Foo {
    static Bar = class {

    }
}

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

Ответ 2

Я не мог заставить это работать с экспортированными классами без получения ошибки компиляции, вместо этого я использовал пространства имен:

namespace MyNamespace {
    export class Foo { }
}

namespace MyNamespace.Foo {
    export class Bar { }
}

Ответ 3

Вот более сложное использование, использующее выражения класса, которые позволяют получить доступ к закрытым членам внешнего класса.

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

Ответ 4

Если вы находитесь в контексте файла объявления типа, вы можете сделать это, смешав классы и пространства имен:

// 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();

Ответ 5

Этот подход работал в среде typescript Angular2/Ionic2.

foo.ts

import { Bar} from './bar';

export class Foo {
    id: number;
    bar: Bar;
}

bar.ts

export class Bar {
    id: number;
}

Пример использования класса:

foo = new Foo();
foo.bar = new Bar();
foo.bar.id = 1;