typer - Fabriksfunktioner som returnerar klasser (= klasskonstruktörer) i TypeScript
Om jag definierar en klass på följande sätt i TypeScript
class A {}
då är A både ett värde och en typ, så jag kan använda det på båda sätten:
type B = A
const C = A
Om A istället skulle vara resultatet av en fin klassfabrikfunktion:
const A = fancyClassFactory(...someArgs)
då är A bara ett värde, INTE en typ ...
Finns det några sätt att använda en sådan klassfabrikfunktion och också få typen av klassen?
Stort tack i förväg.
Svar #1
Om vi antar att A är konstruktorn till klassen kan du använda villkoret InstanceType för att få typen av instansen:
const A = fancyClassFactory(...someArgs)
type A = InstanceType<typeof A>
För det specifika exempel @daniel-hilgarth gav kan du använda villkorliga typer så att returtypen blir olika beroende på det passerade konstantvärdet:
function fancyClassFactory<T extends 'a' | 'b'>(what: T) : (T extends 'a' ? typeof fancyClassFactory.A: typeof fancyClassFactory.B)
function fancyClassFactory(what: string) {
if (what === 'a') {
return fancyClassFactory.A
}
if (what === 'b') {
return fancyClassFactory.B
}
}
namespace fancyClassFactory {
export class A {
foo() { return 'barA'; }
}
export class B {
bar() { return 'fooB'; }
}
}
const A = fancyClassFactory('a');
const B = fancyClassFactory('b');
type TA = InstanceType<typeof A>;
function generic<T>(t: T) {
console.log(t);
}
generic<TA>(new A());
generic<TA>(new B());
