Konstiga valfria klassattribut i TypeScript


Plötsligt från och med idag började koden nedan ge ts2322-fel.
Detta fungerar bra i Typescript playground

Jag kan inte hitta något fel med det, men vad är problemet?

Jag använder Visual Studio Code 1.56.2

class Klass {
  value?: number;

  constructor(value?: number) {
    this.value = value;
  }
}

Svar #1

Du har inte nämnt detta, men jag antar att du använder de nattliga versionerna som publiceras på npm som typescript@next. Om så är fallet ser du troligen en förhandsvisning av en ny funktion för TypeScript 4.4, "strict optional properties", som implementerats i microsoft/TypeScript#43947. (UPPDATERING 2021-06-10) Denna funktionalitet skulle ursprungligen aktiveras via en ny --strictOptionalProperties-kompilatorflagga, som skulle inkluderas i --strict-sviten av kompilatoralternativ. Enligt denna kommentar kommer flaggan dock att byta namn och tas bort från --strict, så alla som vill se detta beteende i TypeScript 4.4 och senare kommer behöva aktivera det manuellt via någon kompilatorflagga vars namn ännu inte har bestämts.

Strikta valfria egenskaper kommer att förhindra att du tilldelar undefined till en valfri egenskap, samtidigt som du fortfarande kan läsa undefined från en sådan egenskap. Detta är mer i linje med hur folk länge har velat att valfria egenskaper ska fungera, vilket bevisas av det (nu äntligen stängda) ärendet microsoft/TypeScript#13195.

Hur som helst betyder detta att det inte längre är säkert att tilldela ett värde som lästs från en valfri parameter till en valfri egenskap av samma typ, utan att först kontrollera om det är undefined:

class Klass {
  value?: number;

  constructor(value?: number) {
    if (value !== undefined) this.value = value;
  }
}

Lekplatslänk till kod

Relaterade artiklar