Zoeken op website

Typescript-type string heeft een undefined-waarde


Ik ben nieuw in TypeScript. Ik weet dat we in TypeScript een afzonderlijk type voor undefined hebben. Hier declareer ik een klasselid als string, maar wanneer ik de waarde in de console weergeef, krijg ik undefined. Ik denk dat het stringtype undefined niet ondersteunt, maar hier kreeg ik een fout.

class test {
    a;
    b: string;
}

let sd = new test();
console.log(sd.b)

Antwoord #1

Dit is te verwachten, omdat typeverklaringen de runtime-waarde van variabelen of klassenleden niet beïnvloeden. Het is noodzakelijk om eerst een waarde toe te wijzen. Zolang er geen waarde is toegewezen, zal de waarde van het klassenlid undefined zijn.

class test {
    a;
    b: string;
}

let sd = new test();
sd.b = 'example';
console.log(sd.b); // logs 'example'
console.log(sd.a); // logs undefined because not assigned yet

Antwoord #2

TypeScript initialiseert eigenschappen niet automatisch op basis van type (omdat JS dat ook niet doet, het heeft tenslotte geen type-informatie om te gebruiken). Als je wilt verzekeren dat je types tijdens runtime zo goed mogelijk kloppen, moet je de compiler configureren om strenger te zijn.

De primaire compileroptie hiervoor wordt strict genoemd, die verschillende controles omvat. Er zijn er nog een paar die je daarnaast kunt inschakelen.

strict bevat de optie strictNullChecks die wordt beschreven als:

In de modus voor strikte null-controle vallen de waarden null en undefined niet binnen het domein van elke type en zijn ze alleen toewijsbaar aan zichzelf en any (de ene uitzondering is dat undefined ook toewijsbaar is aan void).

...en strictPropertyInitialization:

Zorg ervoor dat niet-onbepaalde klasse-eigenschappen worden geïnitialiseerd in de constructor. Deze optie vereist dat --strictNullChecks is ingeschakeld om effect te hebben.

(Uit optiesdocumentatie)

Om strict te configureren, maak een jsconfig.json aan:

{
    "compilerOptions": {
        "strict": true,
    }
}

Met strict aan, wordt je code niet meer gecompileerd:

class test {
    a; // Member 'a' implicitly has an 'any' type.ts(7008)
    b: string; // Property 'b' has no initializer and is not definitely assigned in the constructor.ts(2564)
}

let sd = new test();
console.log(sd.b)

Als je die problemen oplost door waarden toe te wijzen, voorkom je die runtimefouten.

class test {
    a: any;
    b: string = 'something';
}

Gerelateerde artikelen