Letra de imprenta: definir clases y sus métodos en archivos separados

votos
4

¿Es posible declarar una clase en un archivo y definir sus métodos en archivos separados?

Tengo algunas clases con una gran cantidad de métodos y sería genial si pudiera extenderse hacia fuera un poco.

Publicado el 03/10/2012 a las 11:10
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
6

Respuesta corta: Letra de imprenta no admite la división de una definición de clase en varios archivos.

Solución alternativa : Se podría definir una interfaz que contiene los miembros de la clase, y dos clases diferentes de incorporación de dicha interfaz. Entonces mixin propiedades de una clase a la otra, para hacer una clase combinada. Por ejemplo:

LargeClass.a.ts

interface LargeClass {
   methodA(): string;
   methodB(): string;
}

class LargeA implements LargeClass {
   methodA: () => string; // not implemented, needed since otherwise we don't extend LargeClass
   methodB() {
     return "Hello world";
   }
}

LargeClass.b.ts

class LargeB implements LargeClass {
   methodA() {
     return "Foo";
   }
   methodB: () => string; // not implemented, needed since otherwise we don't extend LargeClass
}

Usage.ts

// Using underscore's extend to copy implementation from A to B
var c:LargeClass = _.extend(new LargeA(), new LargeB());

// Manually mixing in a to b
var a = new LargeA();
var b:LargeClass = new LargeB();
for (var prop in a) {
    b[prop]=a[prop];
}

Esto no funcionará si necesita constructores de la clase, sin embargo. Y realmente es subóptima ... Solución sin embargo :)

Ah, por cierto, esto funciona porque mecanografiado no emite declaraciones de tipo de propiedad / terreno unitialised para las clases - que sólo los utiliza para la comprobación de tipos.

También me di cuenta de que se puede hacer esto sin interfaces y sólo la construcción de clases de una forma más bonita ... Dejaré cómo hacerlo como un ejercicio para los lectores por ahora ...

Respondida el 03/10/2012 a las 11:38
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more