Есть ли способ вставить классы в TypeScript. Например. Я хотел бы использовать их как:
var foo = new Foo();
var bar = new Foo.Bar();
Есть ли способ вставить классы в TypeScript. Например. Я хотел бы использовать их как:
var foo = new Foo();
var bar = new Foo.Bar();
Начиная с TypeScript 1.6 у нас есть выражения класса (ссылка).
Это означает, что вы можете сделать следующее:
class Foo {
static Bar = class {
}
}
// works!
var foo = new Foo();
var bar = new Foo.Bar();
Я не мог заставить это работать с экспортированными классами без получения ошибки компиляции, вместо этого я использовал пространства имен:
namespace MyNamespace {
export class Foo { }
}
namespace MyNamespace.Foo {
export class Bar { }
}
Вот более сложное использование, использующее выражения класса, которые позволяют получить доступ к закрытым членам внешнего класса.
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());
Если вы находитесь в контексте файла объявления типа, вы можете сделать это, смешав классы и пространства имен:
// 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();
Этот подход работал в среде 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;