typescript - Generisk og typeof T i parameterne
I TypeScript kan jeg definere typen til en variabel som typen til en klasse. For eksempel:
class MyClass { ... }
let myVar: typeof MyClass = MyClass;
Nå vil jeg bruke dette med en generisk klasse, noe sånt som dette:
class MyManager<T> {
constructor(cls: typeof T) { ... }
/* some other methods, which uses instances of T */
}
let test = new MyManager(MyClass); /* <MyClass> should be implied by the parameter */
Så, jeg vil gi min manager-klasse en annen klasse (dens konstruktør), fordi manageren trenger å hente statisk informasjon knyttet til klassen.
Når jeg kompilerer koden min, står det at den ikke kan finne navnet 'T', der konstruktøren min er.
Noen idé om hvordan man løser det?
Svar #1
Du kan bruke denne typen konstruktører: { new(): ClassType }.
class MyManager<T> {
private cls: { new(): T };
constructor(cls: { new(): T }) {
this.cls = cls;
}
createInstance(): T {
return new this.cls();
}
}
class MyClass {}
let test = new MyManager(MyClass);
let a = test.createInstance();
console.log(a instanceof MyClass); // true
(kode i lekeplass)
Rediger
Den riktige måten å beskrive en klassetype på i TypeScript er å bruke følgende:
{ new(): Class }
For eksempel i TypeScript lib.d.ts ArrayConstructor:
interface ArrayConstructor {
new (arrayLength?: number): any[];
new <T>(arrayLength: number): T[];
new <T>(...items: T[]): T[];
(arrayLength?: number): any[];
<T>(arrayLength: number): T[];
<T>(...items: T[]): T[];
isArray(arg: any): arg is Array<any>;
readonly prototype: Array<any>;
}
Her har du 3 forskjellige ctor-signaturer pluss en haug med statiske funksjoner.
I ditt tilfelle kan du også definere det slik:
interface ClassConstructor<T> {
new(): T;
}
class MyManager<T> {
private cls: ClassConstructor<T>;
constructor(cls: ClassConstructor<T>) {
this.cls = cls;
}
createInstance(): T {
return new this.cls();
}
}
