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.
