I TypeScript, hvorfor er det ikke mulig å initialisere en klasseegenskap ved å kalle en metode?


Følgende TypeScript-kode fungerer som forventet, men TypeScript gir en TS2564-feil på test2- og test3-egenskapene. Er det fordi de er initialisert inne i metoder? Hvordan bør en klasse som denne skrives.

Jeg tror det fungerer som forventet fordi det er gyldig i JavaScript. Kan det være forårsaket av feil TypeScript-innstillinger?

class class1{

    test1:number;//test1 is initialized as expected
    test2:number;//Property 'test2' has no initializer and is not definitely assigned in the constructor.
    test3:number;//Property 'test3' has no initializer and is not definitely assigned in the constructor.

    constructor(){
        //test1 
        this.test1 = 0;

        //test2
        const setTest2To0 = () =>{
            this.test2 = 0;
        };
        setTest2To0();

        //test3
        this.setTest3To0();
    }

    setTest3To0(){
        this.test3 = 0;
    }}

Svar #1

Siden TypeScript 2.7 kan du bruke den definitive tildelingspåstandsmodifikatoren, som betyr å legge til et utropstegn mellom variabelnavnet og kolon:

test3!: number

Dette har samme effekt som å legge til en // @ts-ignore TS2564 kommentar over det, og er at du sier til TS at du definitivt tildeler det gjennom alle mulige kodeutførelsesbaner gjennom konstruktøren.

Svar #2

TypeScript sporer ikke this-endringer i dette tilfellet.

Det finnes imidlertid en løsning. Du kan bruke IIFE-mønsteret for å deklarere test2-egenskapen.

class class1 {

    test1: number;//test1 is initialized as expected
    test2: number;// ok
    test3: number;//Property 'test3' has no initializer and is not definitely assigned in the constructor.

    constructor() {
        //test1 
        this.test1 = 0;

        //test2
        (() => {
            this.test2 = 0;
        })();

        //test3
        this.setTest3To0();
    }

    setTest3To0() {
        this.test3 = 0;
    }
}

Som du kanskje har lagt merke til, er TS i stand til å finne ut at test2 blir initialisert i constructor.

Vennligst husk at TypeScript handler om statisk validering.

Så det er umulig å bruke setTest3To0 for å initialisere Test3?

Ja. Du bør bruke test3: number | undefined. Eller du kan bruke en annen syntaks:

class class1 {
    static getTest3() {
        return 0
    }

    constructor(public test1 = 0, public test2 = 0, public test3 = class1.getTest3()) { }

}

Hvis du bruker public-nøkkelordet, er det ikke nødvendig å erklære alle egenskapene dine slik du gjorde før. Som du kanskje har lagt merke til, har jeg brukt en statisk metode for å sette test3 under klasseinitialisering.

Relaterte artikler