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

Relaterte artikler