javascript - Standardverdi for Type i generiske klasser i Typescript
Jeg må sette en standardverdi for en variabel basert på typen dens i Typescript generiske klasser som nedenfor
class MyClass<T>{
myvariable: T // Here I want to set the value of this variable
// with the default value of the type passed in 'T'
}
For eksempel, hvis T er et tall, skal standardverdien til variabelen myvariable være "0", på samme måte for tekst skal det være en tom streng, og så videre..
Svar #1
Du kan ikke gjøre det, siden den faktiske typen, som er T, bare vil være kjent under kjøring.
Hva du kan gjøre:
abstract class MyClass<T> {
myvariable: T;
constructor() {
this.myvariable = this.getInitialValue();
}
protected abstract getInitialValue(): T;
}
Nå utvider du bare denne klassen, slik:
class MyStringClass extends MyClass<string> {
protected getInitialValue(): string {
return "init-value";
}
}
Rediger
Det du spør om kan ikke gjøres fordi T bare eksisterer i TypeScript-verdenen, og det "overlever" ikke kompilasjonsprosessen.
For eksempel, dette:
class MyClass<T> {
myvariable: T;
constructor(value: T) {
this.myvariable = value;
}
}
Komplileres til:
var MyClass = (function () {
function MyClass(value) {
this.myvariable = value;
}
return MyClass;
}());
Som du kan se, finnes det ingen T i den kompilerte versjonen, så du kan ikke bruke den informasjonen ved kjøretid for å generere en standardverdi.
En annen løsning er å ha et kart over standardverdier:
var defaultValues = {
"string": "",
"number": 0,
"boolean": false
}
class MyClass<T> {
myvariable: T;
constructor(value: T) {
this.myvariable = value;
}
}
let a = new MyClass<string>(defaultValues.string);
let b = new MyClass<boolean>(defaultValues.boolean);
Du kan også bruke statiske fabrikkmetoder:
class MyClass<T> {
myvariable: T;
constructor(value: T) {
this.myvariable = value;
}
static stringInstance(): MyClass<string> {
return new MyClass<string>("");
}
static numberInstance(): MyClass<number> {
return new MyClass<number>(0);
}
static booleanInstance(): MyClass<boolean> {
return new MyClass<boolean>(false);
}
}
let a = MyClass.stringInstance();
let b = MyClass.booleanInstance();
