Apptiva Logo

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

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:

TypeScript meldet Fehler, weil noUncheckedIndexedAccess aktiviert ist.

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:

Die Option `exactOptionalPropertyTypes` erlaubt es nicht undefined zu übergeben, wenn eine Nummer erwartet wird.

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:

process.env.NUMBER_OF_CORES kann nicht als Wert des Properties `numberOfCores` verwendet werden.

Dies müsste man neu z.B. folgendermassen lösen:

Die Properties müssen "gespreded" werden, damit Typescript dies zulässt.