Búsqueda de sitios web

angular - Cómo definir una interfaz para una instancia de clase usando el constructor de la clase


Estoy construyendo una aplicación y parte del código permite al desarrollador especificar qué componente quieren renderizar en cierta parte. Quiero que los usuarios sepan que necesitan implementar una interfaz, pero no estoy seguro de cómo escribir la tipificación correctamente.

export interface ICustomComponent {
    templateObject: any;
}

export class MyComponent implements ICustomComponent {
}

export class MyLib {
    constructor(
        private yourComponent: ICustomComponent
    ) {}
}

new MyLib(MyComponent); <== Fails

Estoy escribiendo código con Angular, y no puedo ejecutar el operador new, sino dejar que Angular resuelva y construya ese componente.

Aquí un ejemplo que ilustra mi problema.

¿Cómo lidiar con este problema?

Respuesta #1

Dado que MyLib espera un constructor de clase, no una instancia de clase, necesitas definir una interfaz para un constructor de clase y especificar que devuelve la instancia con la interfaz ICustomComponent:

interface ICustomComponent {
  templateObject: any;
}

interface ICustomComponentConstructor {
  new (...deps: any[]): ICustomComponent;
}

Y luego puedes usarlo así:

export class MyComponent implements ICustomComponent {
  templateObject: any;
}

export class MyLib {
  constructor(private yourComponent: ICustomComponentConstructor) {
  }
}

new MyLib(MyComponent);

Puedes leer sobre la interfaz para constructores de clases e instancias aquí.