2017-09-18 17 views
3

Je construis une application et une partie du code permet au développeur de spécifier quel composant ils veulent rendre une certaine partie. Je veux que les utilisateurs sachent qu'ils doivent implémenter une interface mais je ne suis pas sûr de savoir comment écrire correctement.Comment définir une interface pour une instance de classe en utilisant le constructeur de classe

export interface ICustomComponent { 
    templateObject: any; 
} 

export class MyComponent implements ICustomComponent { 
} 

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

new MyLib(MyComponent); <== Fails 

Je suis en train d'écrire un code avec angulaire, et je ne peux pas courir nouvel opérateur, mais laisser angulaire de résoudre et de construire ce composant.

Here un exemple qui illustre mon problème.

Comment faire face à ce problème?

+0

Que voulez-vous passer ici 'new MyLib (...);'? Instance comme 'new MyLib (new MyComponent());' ou référence à la classe? –

+0

https://angular.io/guide/dynamic-component-loader#resolving-components Cet exemple illustre uniquement le problème – tom10271

+0

. Voulez-vous transmettre 'MyComponent' à componentFactoryResolver.resolveComponentFactory (MyComponent);'? –

Répondre

2

Depuis MyLib attend un constructeur de classe, pas par exemple la classe, vous devez définir une interface pour un constructeur de classe et de préciser qu'elle retourne l'instance avec l'interface ICustomComponent:

interface ICustomComponent { 
    templateObject: any; 
} 

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

Et puis vous pouvez l'utiliser comme ceci:

export class MyComponent implements ICustomComponent { 
    templateObject: any; 
} 

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

new MyLib(MyComponent); 

Vous pouvez lire sur l'interface pour les constructeurs de classe et les instances here.