TypeScript noch strikter machen
Es gibt neben “strict”:true noch weitere Möglichkeiten, um mit TypeScript noch mehr Fehler zu vermeiden bevor sie überhaupt passieren.
Publiziert am von Patrik Stutz
Es gibt neben “strict”:true noch weitere Möglichkeiten, um mit TypeScript noch mehr Fehler zu vermeiden bevor sie überhaupt passieren.
Publiziert am von Patrik Stutz
Wenn man TypeScript verwendet, gibt es eine Compiler-Option, die man auf jeden Fall immer einschalten sollte, nämlich “strict”:true
.
Dadurch wird direkt eine ganze handvoll weiterere Optionen aktiviert, die man im Notfall auch alle einzeln aktivieren könnte. Dazu gehören alwaysStrict
, noImplicitAny
, noImplicitThis
, strictNullChecks
, strictBindCallApply
, strictFunctionTypes
, strictPropertyInitialization
, und useUnknownInCatchVariables
. Diese fangen schonmal eine vielzahl von Fehler ab, bevor sie passieren.
Dann gibt es aber noch Optionen, die man zusätzlich noch immer separat aktivieren kann, die zum Teil aber nicht weniger wünschenswert sind. Zwei davon möchte ich nun noch etwas genauer beleuchten:
Hier spricht Code mehr als Worte:
Beide Fehler meldet TypeScript nur, wenn noUncheckedIndexedAccess
aktiviert ist. Deshalb empfehle ich diese zumindest für neue Projekte immer gleich zu aktivieren. Wenn man versucht dies nachträglich bei einem Projekt zu aktivieren, erlebt man oft sein blaues Wunder.
Wenn diese Option nicht aktiviert ist, dann kann man einer optionalen Property automatisch immer auch den Wert undefined
zuweisen. Dies wird dann zum Problem, wenn man anfängt Objekte mit optionalen Properties zu mergen, denn beim Mergen macht es einen grossen Unterschied ob eine Property nicht gesetzt ist, oder ob sie auf den Wert undefined
gesetzt ist.
Folgendes Beispiel soll verdeutlichen, dass dies zu gefährlichen Situationen führen kann:
Ohne die Option exactOptionalPropertyTypes
würde TypeScript den obigen Aufruf zu runProgram
zulassen und das würde wiederum dazu führen, dass numberOfCores
im options-Objekt undefined
ist, obwohl dies für den Options
-Typ eigentlich gar nicht zulässig ist. Es kann also durchaus sinnvoll sein die Option zu aktivieren.
Durch das Aktivieren der Option entstehen aber oft neue Probleme. Eines davon zum Beispiel hier:
Dies müsste man neu z.B. folgendermassen lösen: