Vyhledávání na webu

Generika v TypeScriptu: Jak odvodit typ instance z třídy


Tovární funkce vytváří instance tříd:

class A {
    name: string
}
function factory<T>(Cl): T {
    return new Cl()
}
let a = factory<A>(A)
a.name // OK

Chtěl bych se vyhnout opakování A v: factory<A>(A). Typ instance generik by měl být schopen být odvozen z typu třídy, neměl by?

Zkoušel jsem tento kód:

function factory<T>(Cl: typeof T): T { // Error: Cannot find name 'T'
    return new Cl()
}

Existuje způsob, jak to udělat?

Odpověď č. 1

Na základě dokumentace Typescriptu:

Při vytváření továren v TypeScriptu pomocí generik je nutné odkazovat na typy tříd jejich konstrukčními funkcemi.

Takže musíte udělat něco takového:

function factory<T>(Cl: { new(): T; }): T {
    return new Cl();
}

V kódu výše musí Cl být typ, který má alespoň konstruktor, který vrací generický typ T.

Takže inference typů bude fungovat:

let a = factory(A);
a.name;

Stejně nemusíte specifikovat typ A, protože jej kompilátor zná.

Související články