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.](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fg5oll5fh%2Fproduction%2F814867387f63bfae3e8b4dc7ec99958bbfab11de-471x175.png&w=1920&q=75)
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.](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fg5oll5fh%2Fproduction%2F2bd0c1d05be98d3d2d31e902d2a3d3012720f492-714x397.png&w=1920&q=75)
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.](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fg5oll5fh%2Fproduction%2F7ed2664fb70ca9cdd9dddac19d53253579ca220e-710x75.png&w=1920&q=75)
Dies müsste man neu z.B. folgendermassen lösen:
![Die Properties müssen "gespreded" werden, damit Typescript dies zulässt.](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fg5oll5fh%2Fproduction%2F9a8bcb4bb01f03269589dea980e190be7c331a40-710x75.png&w=1920&q=75)