Zero Any
Strict mode z `noImplicitAny`, `strictNullChecks` i `exactOptionalPropertyTypes` — 487 plików TypeScript bez jednego `any`, bez `@ts-ignore`, bez rzutowań obejściowych. Każda ścieżka kodu jest typowana przez kompilator.
487 plików TypeScript przechodzi przez `tsc --strict` z zerem błędów i zerem `any`. Strict mode to nie kwestia preferencji — to 9 flag kompilatora, które razem eliminują całą klasę błędów runtime zanim kod dotrze do przeglądarki. Zod 4 domyka pętlę: runtime validation z automatyczną inferencją typów z jednej definicji schematu.
TypeScript bez strict mode to JavaScript z opcjonalnymi adnotacjami. Większość projektów włącza `typescript` w tsconfig ale zostawia `strict: false` — albo gorzej, tworzy wyjątki przez `// @ts-ignore` i `as any` wszędzie gdzie typy stają się trudne. Efekt: fałszywe poczucie bezpieczeństwa i błędy runtime, które TypeScript miał eliminować.
`strict: true` to nie jedna flaga, to dziewięć. `noImplicitAny` blokuje niejawne `any`. `strictNullChecks` wymusza obsługę `null` i `undefined` w każdym miejscu gdzie mogą wystąpić. `exactOptionalPropertyTypes` rozróżnia `{ field?: string }` od `{ field: string | undefined }` — to różnica między polem nieistniejącym a polem istniejącym z wartością undefined. `noUncheckedIndexedAccess` sprawia że każdy dostęp przez indeks zwraca `T | undefined` zamiast `T`. W MazCode wszystkie dziewięć flag włączone, 487 plików, zero tolerancji.
Zod 4 zamyka lukę między compile time a runtime. TypeScript sprawdza typy podczas kompilacji, ale w runtime dane z formularzy, API i CMS są `unknown`. Zod schema to pojedyncza definicja z której TypeScript inferencją wyciąga typ: `const schema = z.object({ name: z.string(), age: z.number() })` i `type Data = z.infer<typeof schema>` — jeden source of truth dla struktury danych. Dane niewalidowane nie przechodzą przez granicę do logiki aplikacji.
Discriminated unions to wzorzec, który eliminuje całą kategorię błędów obsługi stanu. Zamiast `{ status: string, data?: User, error?: string }` — `{ status: 'ok', data: User } | { status: 'error', error: string }`. TypeScript narrowing w gałęzi `if (result.status === 'ok')` automatycznie zawęża typ do pierwszej odmiany — kompilator wie, że `result.data` istnieje i ma typ `User`. Bez rzutowań, bez optional chaining, bez defensywnych sprawdzeń.
Template literal types i const assertions dają TypeScript możliwości bliskie dependent types. `type Route = '/admin/' + string` w formie template literal to typ string z walidowanym prefiksem — kompilator odrzuca dowolny string niespełniający wzorca. `const ROLES = ['owner', 'admin', 'editor'] as const` daje `typeof ROLES[number]` jako union type zamiast luźnego `string` — i każde miejsce w kodzie które akceptuje rolę jest zwalidowane przez kompilator. W MazCode system RBAC z 4 rolami i 9 uprawnieniami jest w całości typowany przez const assertions — dodanie nowej roli bez aktualizacji wszystkich miejsc sprawdzania jest niemożliwe na etapie kompilacji.
Praktyczny efekt dla developerów: IDE autocomplete działa w 100% przypadków, go-to-definition przechodzi przez granice plików i modułów, refactoring przez rename symbol aktualizuje wszystkie referencje. Koszt onboardingu nowego developera spada drastycznie — codebase jest samodokumentujący się przez typy. Koszt błędów produkcyjnych z błędnych założeń o kształcie danych: zero, bo kompilator nie pozwoli na deployment.
Dla klienta to oznacza: mniej bugów w produkcji, szybsze wdrożenie zmian, niższy koszt utrzymania na przestrzeni lat. Projekt z TypeScript strict mode po 2 latach ma tę samą przewidywalność co w tygodniu po launchu.
Strict mode z `noImplicitAny`, `strictNullChecks` i `exactOptionalPropertyTypes` — 487 plików TypeScript bez jednego `any`, bez `@ts-ignore`, bez rzutowań obejściowych. Każda ścieżka kodu jest typowana przez kompilator.
TypeScript narrowing, discriminated unions, const assertions i template literal types zastępują ręczne adnotacje. Kompilator wnioskuje typy z kontekstu — mniej kodu, więcej gwarancji, pełny autocomplete w IDE.
Schematy Zod 4 walidują dane z API, formularzy i CMS w runtime, a `z.infer<typeof schema>` generuje typy TypeScript automatycznie — jedna definicja jako source of truth dla compile time i runtime.
Pełny autocomplete, go-to-definition przez granice modułów, type-safe refactoring przez rename symbol. Codebase jest samodokumentujący się — onboarding nowego developera trwa godziny, nie tygodnie.
487 plików TypeScript, strict mode, zero `any` — i każda zmiana w interfejsie natychmiast podświetla wszystkie miejsca wymagające aktualizacji. Bugów runtime z błędnych założeń o kształcie danych w produkcji: zero, bo kompilator nie pozwoli na deployment ze złymi typami.