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 von Patrik Stutz am 27.11.2023

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:

noUncheckedIndexedAccess

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.

exactOptionalPropertyTypes

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 runProgramzulassen 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: