javascript - Vad är den korrekta typen för en variabel i TypeScript som initialt är odefinierad?


Jag har en variabel som vi i det här exemplet kommer att kalla a:

let a;

Jag vill bara tilldela det ett värde om det uppfyller ett av kraven i switch-satsen:

switch(someOtherVar) {
  case "a": {
    a = "123";
    break;
  }
  case "b": {
    a = "456";
    break;
  }
}

Jag vill sedan kontrollera om det har ett värde på följande sätt:

if (a) {
  // ...do something
}

Detta betyder att a kan vara en string eller undefined, och det börjar som undefined. Om jag inte deklarerar typen så kastar det följande fel:

Variabeln 'a' har implicit typen 'any', men en bättre typ kan härledas från användningen.ts(7043)

Jag är inte säker på vad det korrekta sättet att deklarera typen skulle vara i det här fallet:

1. let a: string | undefined; // this seems to be the best way
2. let a = undefined; // this declares it as any which I don't want
3: let a: string; // is this correct if it can be undefined?

Svar #1

Den korrekta typen är string | undefined. Under strictNullChecks innehåller typen string inte värdet undefined eller värdet null. Dessa två värden har sina egna typer undefined och null. Så för att ha en variabel som är string eller undefined är det lämpligt att använda en union.

Observera att kontrollflödesanalys gör ett ganska bra jobb med att härleda typen för ditt specifika användningsfall om variabeln inte refereras i en stängning

let a = undefined; // any here 

switch(someOtherVar) {
  case "a": {
    a = "123";
    break;
  }
  case "b": {
    a = "456";
    break;
  }
}
// function x() { console.log(a)}; // if referenced in another function you get an error

a; // but the type of a is string | undefined 

Lekplatslänk

Svar #2

Ditt första förslag är korrekt eftersom a inte kan vara any.

Ditt andra förslag har fortfarande typen any. Du skulle behöva göra det på följande sätt men det är i princip samma som ditt första förslag.

let a: string | undefined = undefined;

Ditt tredje förslag kommer att orsaka problem eftersom motorn inte förväntar sig att värdet ska vara odefinierat.

Om du vet att det är en sträng, kan du deklarera den som en tom sträng och senare kontrollera längden på strängen.

let a: string = "";
if (a.length > 0) {
  // do something...
}