¿Hay alguna forma de anidar clases en TypeScript? Por ejemplo, me gustaría usarlos como:
var foo = new Foo();
var bar = new Foo.Bar();
javascript
typescript
basarat
fuente
fuente
Respuestas:
Comenzando con TypeScript 1.6 tenemos expresiones de clase ( referencia ).
Esto significa que puede hacer lo siguiente:
class Foo { static Bar = class { } } // works! var foo = new Foo(); var bar = new Foo.Bar();
fuente
Aquí hay un caso de uso más complejo usando expresiones de clase .
Permite que la clase interna acceda a los
private
miembros de la clase externa.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
fuente
No pude hacer que esto funcione con clases exportadas sin recibir un error de compilación, en su lugar usé espacios de nombres :
namespace MyNamespace { export class Foo { } } namespace MyNamespace.Foo { export class Bar { } }
fuente
Si está en el contexto de un archivo de declaración de tipos, puede hacerlo mezclando clases y espacios de nombres:
// 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();
fuente