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á.
