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());

Relaterade artiklar