Typescript Generics: returnera instans av klassparameter
Jag har en datalagring och vill skapa en metod för att ladda data från lagringen. Lagringen innehåller olika typer (klasser) av data. Låt oss säga att min lagring innehåller (bland annat) data av typen Författare. Jag vill ladda författaren med id 1:
const author1 = store.loadById(Author, 1);
Hur ska jag nu använda generics för att få TS-kompilatorn att veta att author1 är en instans av Author?
Jag har nu
public loadById<T>(entityClass: T, id: number): T {
const entity;
// logic to load the entity ...
return entity;
}
men det är fel eftersom TSC nu tror att min metod returnerar en entityClass istället för en instans av entityClass. Så hur måste jag specificera returtypen för metoden för att få author1 att vara en instans av Author?
Svar #1
Du skickar in klassen Author till metoden, inte en instans av Author-klassen, så parametern behöver vara en konstruktörssignatur:
public loadById<T>(entityClass: new () => T, id: number): T {
const entity = new entityClass();
// logic to load the entity ...
return entity;
}
const author1 = store.loadById(Author, 1); // will be of type Author
Eller om du har argument till konstruktorn, kan du specificera dem i signaturen:
public loadById<T>(entityClass: new (data: any) => T, id: number): T {
const entity = new entityClass(null as any); // pass data
// logic to load the entity ...
return entity;
}
Svar #2
För dem som vill skicka en klass och returnera en instans av klassen
function newInstance<T extends new () => InstanceType<T>>(TheClass: T): InstanceType<T> {
return new TheClass();
}
