Kodėl strict yra esmė
Iki šiol naudojomės strict: true, bet nesigilinom. Ši pamoka — apie tai, kodėl griežtumas ir yra visa TypeScript prasmė. Be jo TypeScript beveik nieko negaudo — tai tik „JavaScript su tipų sintakse". Su juo tipai pradeda reikalauti tikro tikslumo.
Trys flag'ai, kuriuos nagrinėsim:
noUncheckedIndexedAccess. Masyvo indeksas gali neegzistuoti:
const arr = [1, 2, 3];
const x = arr[10]; // vykdymo metu — undefined, bet tipas sako `number`?!
Su šiuo flag'u arr[10] tampa number | undefined. Negali apsimesti, kad indeksas visada yra. Prisimink 17 pamokos date.toISOString().split('T')[0] — kompiliatorius verčia apdoroti atvejį, kai [0] nėra.
exactOptionalPropertyTypes. Skiriasi „nėra lauko" ir „laukas yra, bet undefined":
interface T { x?: string }
const a: T = {}; // ✅ x nėra
const b: T = { x: undefined }; // ❌ su exactOptional — „yra, bet undefined" ≠ „nėra"
Subtilu, bet svarbu: hdurl?: string reiškia „gali nebūti", ne „gali būti undefined reikšmė".
assertNever() — išsamumo (exhaustiveness) garantija. Tai gudriausia. assertNever(value: never) dedama switch default šakoje. Jei prie sąjungos pridedi naują variantą ir pamiršti jį apdoroti, value nebėra never, ir assertNever tampa kompiliavimo klaida — nurodydama tiksliai tą switch, kurį pamiršai atnaujinti.
Tai paverčia „pridėjau variantą ir kažkur pamiršau jį apdoroti" iš tylaus vykdymo meto bugo į kompiliatoriaus klaidą, rodančią pirštu į kodą. Būtent to reikia augančiai programai: pakeiti tipą vienoje vietoje, o kompiliatorius suranda visas vietas, kurias reikia atnaujinti.