Tengo una clase base y una clase derivada. El argumento del constructor de la clase derivada (DerivedOptions) necesita todas las propiedades BaseOptions con otras adicionales, así que las representé como interfaces y las extendí. ¿Es la forma correcta de hacer esto? También veo que la gente está usando type para representar las opciones que se pasan a las clases. ¿Hay alguna forma de que pueda lograr esta funcionalidad usándola?

interface BaseOptions {
   arg1: string;
}

class BaseClass {
  constructor(options: BaseOptions) { }
}

interface DerivedOptions extends BaseOptions {
   arg2: string;
}

class DerivedOptions extends BaseOptions {
   constructor(options: DerivedOptions) {
     super();
   }
}
0
VJAI 10 dic. 2016 a las 09:38

1 respuesta

La mejor respuesta

Sí, esa es una forma correcta de hacerlo, excepto que olvidó pasar el objeto de opciones al llamar a super:

class DerivedOptions extends BaseOptions {
   constructor(options: DerivedOptions) {
     super(options);
   }
}

En cuanto al uso de alias de tipo, no lo hará funcionan bien en su caso porque (como se indica en Interfaces frente a alias de tipo):

Una segunda diferencia más importante es que los alias de tipo no se pueden extender o implementar desde (ni pueden extender / implementar otros tipos). Debido a que una propiedad ideal del software está abierta a la extensión, siempre debe usar una interfaz sobre un alias de tipo si es posible.

Así que esto:

type BaseOptions = {
   arg1: string;
}

type DerivedOptions extends BaseOptions = {
   arg2: string;
}

No es posible y no se compilará con varios errores.

2
Nitzan Tomer 10 dic. 2016 a las 17:11