javascript - Pasar clase como parámetro genérico en Typescript
estoy tratando de instanciar una clase pasada como parámetro a otra, tengo esto en un archivo, ImportedClass.ts:
export default class ImportedClass {
public constructor(something: any) {
}
public async exampleMethod() {
return "hey";
}
}
Y esto en otro, InstanceClass.ts:
interface GenericInterface<T> {
new(something: any): T;
}
export default class InstanceClass <T> {
private c: GenericInterface<T>;
public constructor(c: T) {
}
async work() {
const instanceTry = new this.c("hello");
instanceTry.exampleMethod();
}
}
Y esto en otro, ClassCaller.ts: <--EDITED-->
import ImportedClass from './ImportedClass';
import ImportedClass from './InstanceClass';
const simulator = new InstanceClass <ImportedClass>(ImportedClass);
Entonces, cuando lo llamo así:
simulator.work();
Lanza este error:
error TS2339: Property 'exampleMethod' does not exist on type 'T'.
Cualquier ayuda es bienvenida, gracias.
Respuesta #1
Si T debe tener un método llamado exampleMethod, debe incluir esto en la restricción para T en Simulator para poder usarlo dentro de Simulator:
export class ImportedClass {
public constructor(something: any) {
}
public async exampleMethod() {
return "hey";
}
}
interface GenericInterface<T> {
new(something: any): T;
}
export class Simulator<T extends { exampleMethod(): Promise<string> }> {
public constructor(private c: GenericInterface<T>) {
}
async work() {
const instanceTry = new this.c("hello");
await instanceTry.exampleMethod();
}
}
const simulator = new Simulator(ImportedClass);
simulator.work()
Enlace del parque
Hubo otros pequeños problemas que necesitaban ser solucionados para que el fragmento anterior funcionara, pero ese es el problema principal.
