Przemysław Zalewski

TypeScript i Node.js od 2017

Zatrudnij programistę TypeScript: błędy łapie kompilator, nie Twoi klienci

Dziewięć lat TypeScriptu i Node.js na produkcji. Typuję całe API, więc zmiana nazwy pola psuje build, a nie zamówienia klientów. Dowody niżej: platforma na Postgresie z 300+ GB danych, typowana biblioteka w npm i CASA Tier 2 od Google jako testy na każdym PR.

Rozmowy w tym tygodniu · start pracy 3 listopada 2026 · Wrocław, zdalnie

Przemysław Zalewski
9lat TypeScriptu, Reacta i Node.js
300+ GBdanych produkcyjnych na platformie, którą prowadziłem
~2/3zmergowanych PR w 2026 zbudowanych z agentami AI, prawie wszystkie przez mój review albo merge
15+lat tworzenia oprogramowania

Brzmi znajomo?

Problemy z TypeScriptem i Node.js, które rozwiązuję w 2026

Czy warto przenieść projekt z JavaScriptu na TypeScript?

Badanie z lutego 2026 pokazało, że agenci AI piszący w TypeScripcie sięgają po furtkę any 9 razy częściej niż ludzie, a mimo to ich pull requesty są akceptowane 1,8 raza częściej (Lee i in., 2026). Typy pomagają agentom tylko wtedy, gdy surowe reguły nie pozwalają im wyłączyć sprawdzania.

Migruję plik po pliku z agentami AI, którzy pracują według narzuconych reguł. Najpierw testy utrwalają obecne zachowanie, potem włączam strict katalog po katalogu, a każdy merge zatwierdza człowiek, więc wdrożenia mogą iść dalej w trakcie migracji. W styczniu 2024 włączyłem TypeScript w Workerach Cloudflare jednego produktu, a w marcu 2026 podniosłem backend do TypeScriptu 6, w którym CommonJS jest przestarzały.

Łatka bezpieczeństwa Node.js: do której wersji aktualizować?

Wydanie bezpieczeństwa Node.js z 21 października 2026 załatało dziesięć luk, w tym cztery o wysokiej wadze, na przykład błąd dekodera Brotli w node:zlib, który może wywrócić serwer albo pozwolić na zdalne wykonanie kodu. Poprawki mają tylko wersje 26.12.1, 24.22.1 i 22.23.4, a linie bez wsparcia, jak Node 20, nie dostaną łatki wcale (wydania bezpieczeństwa Node.js).

Wersję Node.js podnoszę falami, które da się cofnąć, z testami uruchamianymi po każdej fali. Pod koniec 2025 przeniosłem dwa produkty na Node.js 24 LTS, a ten na hostingu, który nie nadążał, przełączyłem, gdy tylko hosting zaczął go wspierać.

Masz to u siebie? Umów bezpłatne 30 minut →

Koniec wsparcia Postgres 14: jak zaktualizować bez przestoju?

PostgreSQL 14 dostaje ostatnie wydanie 12 listopada 2026, potem nie będzie już poprawek błędów ani bezpieczeństwa. Wersja 13 straciła wsparcie 13 listopada 2025 (zasady wersjonowania PostgreSQL).

Prowadziłem platformę na Postgresie do ponad 300 GB, z partycjonowaniem po klientach i wdrożeniami blue/green bez przestojów. Twoją aktualizację robię tak samo: próba na kopii, potem przełączenie, które da się cofnąć. W sierpniu 2026 produkcyjnej bazie skończyło się miejsce na dysku; przeniosłem ją na nowy serwer etapami, ze snapshotem przed każdym destrukcyjnym krokiem, z zapasem na około osiem miesięcy.

API w Node.js pada przy nieoczekiwanych danych?

OWASP Top 10 z 2025 dodał nową kategorię: błędna obsługa sytuacji wyjątkowych, czyli brak walidacji wejścia i nieobsłużone wyjątki, które wywracają serwer albo przepuszczają żądanie (OWASP Top 10:2025 A10).

Na granicy systemu typuję dane jako unknown, waliduję je Zodem tam, gdzie wchodzą, a błędy są częścią typów. Testy wysyłają te same zepsute żądania, które wyślą użytkownicy i boty. Gdy w październiku 2023 aktualizacja przeglądarki zmieniła format stref czasowych i walidacja zaczęła odrzucać użytkowników, wypuściłem poprawkę tego samego dnia.

Masz jeden z tych problemów? Umów bezpłatne 30 minut →

Dlaczego ja

Typy łapiące błędy w miejscu wywołania

Generyki, które wnioskują, discriminated unions zamiast flag, unknown na granicy i Zod tam, gdzie wchodzą dane. Zespół pisze mniej adnotacji, a błędne wywołanie świeci się na czerwono w edytorze.

Podatności łatane tego samego dnia

React2Shell załatany w dniu publikacji ostrzeżenia, kilka dni przed publicznymi skanerami. Potem przeszukanie Twojego kodu regexpem pod tę samą klasę błędu, flagi hardeningu Node.js i praktyki OWASP, żeby następna podatność zabolała mniej.

Postgres, który rośnie do 300+ GB bez przestojów

Partycjonowanie po tenancie pozwala bazie rosnąć w stronę terabajtów. Wdrożenia blue/green wypuszczają zmiany bez przestoju. Całą historię opisuję w pierwszym projekcie niżej.

Aktualizacje na żywo bez odpytywania

Server-sent events wysyłają zmiany prosto na ekran, strumieniowany HTML pokazuje wynik agenta na bieżąco, WebSockets tylko tam, gdzie ruch idzie w obie strony. Mniej żądań, a strona szybciej pokazuje pierwszą treść.

Pokaz na żywo

JSON wchodzi, TypeScript wychodzi

Wklej prawdziwą odpowiedź z API i dostań typy w TypeScripcie: pola opcjonalne, unie literałów i discriminated unions, nazwane typy zagnieżdżone, strażnika w runtime i typowany wrapper na fetch. Bez kompilatora, same reguły systemu typów spisane ręcznie.

Ładuję pokaz…

Spróbuj tablicy obiektów, w której części pól brakuje albo mają inny typ. Przełącz „rozszerz literały” i „readonly”.

Dowody

Praca, którą mogę pokazać

Problem, co zrobiłem, efekt. Nazwy klientów tylko tam, gdzie wolno mi ich użyć.

Platforma list supresji: od MVP do produktu, 300+ GB na produkcji

Problem
Brytyjski wydawca mailingowy potrzebował list supresji gotowych na skalę terabajtów, z zapisem w stałym czasie i wdrożeniami bez przestoju.
Co zrobiłem
Prowadziłem mały zespół od MVP do pełnej platformy. Partycjonowanie Postgresa po tenancie i liście, równoległe pipeline’y żądań, wdrożenia blue/green. Wypisanie jednym kliknięciem wyszło cztery miesiące przed ogłoszeniem wymogu przez Google i Yahoo.
Efekt
300+ GB i miliony zdarzeń na produkcji, wdrożenia bez przestoju, ścieżka wypisu działająca przy celowo wyłączonym backendzie i funkcja compliance gotowa, zanim powstał termin. W sierpniu 2026 znalazłem osierocone partycje tabel po usuniętych kontach i demach sprzedażowych, zatrzymałem ich przyrost i odzyskałem około 140 GB.

300+ GB wypis odporny na awarię blue/green

Typowana biblioteka narzędziowa, setki funkcji, pełne pokrycie testami

Problem
Zespoły wciąż pisały te same helpery z nieco innymi błędami.
Co zrobiłem
Setki funkcji w TypeScripcie z generykami, które wnioskują zamiast wymagać adnotacji, codegen w CI, pełne testy, publikacja do npm.
Efekt
Jedna biblioteka w wielu projektach, typy łapiące błędy w miejscu wywołania.

npm generics codegen

CASA Tier 2 zamienione w zestaw testów Playwright

Problem
Dostęp OAuth do Gmaila wymaga co roku oceny CASA od Google. Kwestionariusz nie zatrzymuje regresji.
Co zrobiłem
Każda kontrola CASA i OWASP ASVS zakodowana jako test Playwright. E2E i regresja wizualna w sześciu konfiguracjach przeglądarek i urządzeń, na każdym pull requeście.
Efekt
CASA Tier 2 zaliczone, przegląd OAuth Yahoo zaliczony, a coroczny obowiązek stał się ciągłą kontrolą.

CASA Tier 2 OWASP ASVS 6 targetów

Masz podobny problem? Umów bezpłatną rozmowę →

Jedna noga w drzwiach

Nie czas na projekt? Zacznij od tygodnia albo jednego PR‑a.

Dwa sposoby, żeby zobaczyć, jak pracuję, zanim zamówisz sprint. Stały zakres, widełki ceny poniżej, ostateczna kwota na piśmie w ciągu 24 godzin od rozmowy.

Tygodniowy audyt kodu TypeScript i Node.js

Ręcznie czytam repo, CI, testy, wdrożenia i miejsca, których zespół unika. Dostajesz pisemny raport: ryzyka uszeregowane po koszcie, co naprawić najpierw, plan z kamieniami milowymi i decyzję go/no‑go, którą da się obronić. Raport zostaje u Ciebie bez względu na to, czy pracujemy dalej.

4 500⁠–⁠8 800 zł netto · 30⁠–⁠40 h · Zobacz cenę i termin →

Code review jednego pull requesta albo modułu

Przyślij diff, który Cię martwi. W kilka dni dostajesz komentarze do linii, trzy rzeczy, które zmieniłbym najpierw, i werdykt: zmergowałbym czy nie. W jednym produkcie przejrzałem od 2018 roku ponad 800 pull requestów.

300⁠–⁠880 zł netto · 2⁠–⁠4 h · Zobacz cenę i termin →

Umów rozmowę i wybierz Najpierw bezpłatna rozmowa 30 min. Jeśli żadne nie pasuje, powiem to na rozmowie.

Jak to działa

Trzy kroki od tej strony do działającego projektu.

  1. 1

    Rozmowa 30 minut

    Opisujesz produkt i problem. Ja zadaję pytania, które zadałbym pierwszego dnia.

  2. 2

    Zakres na piśmie

    W ciągu 24 godzin po rozmowie dostajesz krótki plan na piśmie: co budujemy najpierw, co mierzymy, jak pracujemy i ile to kosztuje. Bez prezentacji.

  3. 3

    Działający kawałek w pierwszym tygodniu

    Wdrożony, zmierzony i gotowy do przejrzenia. Dalej tempo wyznaczają liczby.

Dopasowanie

Czy to pasuje?

Dobre dopasowanie, gdy

  • Potrzebujesz seniora, który bierze odpowiedzialność za dowiezienie, nie pary rąk
  • Produkt ma wyjść i być mierzony, z product managerem albo bez
  • Współpraca solo albo jeden zespół do czterech osób, który prowadzę bezpośrednio
  • TypeScript, React, Node.js, Cloudflare, Postgres, PostHog, a Python, gdy praca tego wymaga

Raczej nie, gdy

  • Projekt na dziesięcioosobowy zespół dostawcy
  • Stack zbudowany wokół Javy albo chmury, w której nie pracuję
  • Body leasing na godziny bez wpływu na sposób pracy

Styl pracy

Jak pracuję

Review jako rzemiosło

800+ przejrzanych pull requestów w jednym produkcie od 2018 roku. Patrzę na produkt i jego powody. Kod jest drugi.

Zero zaległych bugów

Błąd jest naprawiony albo świadomie zamknięty, nigdy odłożony. Alerty i śledzenie błędów w każdym projekcie, więc o problemach dowiaduję się przed klientem.

Agenci pod regułami

Claude Code i Codex pracują na mainie z hookami, bramkami lint i testów. Model podpowiada, kryteria decydują. Każdy PR ma ludzki review, a treści z AI są oznaczone.

Warto wiedzieć

Fakty o TypeScripcie i Node.js z 2026

TypeScript 7 to port do Go

TypeScript 7.0 wyszedł 8 lipca 2026 jako natywny port. Pełne buildy są zwykle 8 do 12 razy szybsze, a paczka nadal nazywa się typescript i uruchamia się jako tsc (TypeScript 7.0).

7.0 nie ma jeszcze API programistycznego

Narzędzia, które wołają API kompilatora, zostają na TypeScripcie 6.0 przez @typescript/typescript6, dopóki 7.1 nie da nowego API (TypeScript 7.0).

Stare opcje w 7 to twarde błędy

target es5, baseUrl, moduleResolution node10 i downlevelIteration nie przejdą w TypeScripcie 7. ignoreDeprecations "6.0" było tylko mostem (TypeScript 7.0, TypeScript 6.0).

TypeScript 6 zmienił domyślne ustawienia

strict jest domyślnie włączony, a types domyślnie pusty, więc globalne jak process znikają, dopóki nie dodasz "types": ["node"] (TypeScript 6.0).

Node uruchamia pliki .ts, ale ignoruje tsconfig

Usuwanie typów jest domyślnie włączone od Node 22.18. Node ignoruje tsconfig.json, więc aliasy paths nie działają, a enumy i parameter properties rzucają błąd (dokumentacja Node.js).

Import samych typów wymaga słowa type

Bez import type Node traktuje import jak wartość i wywraca się w runtime. Importy muszą mieć rozszerzenie .ts, a pliki .ts w node_modules są odrzucane (dokumentacja Node.js).

FAQ

Pytania, które padają przed umówieniem rozmowy

Czy na czas migracji trzeba wstrzymać nowe funkcje?
Nie. Najpierw typy na granicach, potem moduł po module, gdy i tak się go zmienia. Kod w przeglądarce bez frameworka, skrypty Node.js i legacy ES5 opisuję na stronie o JavaScripcie, z pokazem event loopu na żywo.
Ile to kosztuje?
Godzinowo 180 zł netto w bazie, 150 zł przy prostych zadaniach i 220 zł przy trudnych. Kontrakt B2B na pełne obłożenie to 30 000 zł netto miesięcznie, minimum trzy miesiące. Kwoty w EUR i USD są w cenniku.
Od kiedy możesz zacząć?
Od 3 listopada 2026. Umów rozmowę, ustalimy pierwszy kamień milowy.
Jak testujesz?
Jednostkowe tam, gdzie siedzi logika, Playwright do end‑to‑end i regresji wizualnej, a kontrole bezpieczeństwa zakodowane jako testy. W jednym produkcie kontrole CASA Tier 2 od Google chodzą jako zestaw Playwright na każdym PR.
Jak ścisły jest Twój TypeScript?
Strict mode, bez any na granicach, generyki tam, gdzie usuwają adnotacje, i reguła lintera na wszystko, co nie może być typem. Dane z zewnątrz przechodzą przez Zod: ciała żądań, środowisko, zewnętrzne API. Jeden schemat, jeden wnioskowany typ, jedno miejsce do zmiany.
Express, Fastify czy coś innego?
Najczęściej Express, bo każdy zespół już go zna, a ekosystem middleware jest nudny w dobrym sensie. Fastify, gdy przepustowość jest wąskim gardłem. Workers, gdy kształt to żądanie i odpowiedź.
Jesteś jedną osobą. A jeśli się nie uda albo zachorujesz?
Zacznij od małego: tygodniowy audyt albo review jednego pull requesta, oba z ceną ustaloną przed startem. Rozliczenie godzinowe nie ma minimum, więc przerwiesz w każdej chwili i zatrzymasz wszystko, co dostarczone. Kod, CI i dokumentacja są w Twoim repozytorium od pierwszego commita, umowa przenosi na Ciebie autorskie prawa majątkowe na piśmie, a każdy projekt ma runbook i opis architektury. Gdy choruję, wiesz o tym tego samego dnia. Jak pracuję.
Czy przechodzić już na TypeScript 7?
Dla zwykłego TypeScriptu i Node.js tak: buildy przyspieszają 8 do 12 razy. Najpierw usuń baseUrl, es5 i node10. Projekty, których narzędzia używają API kompilatora, czekają na 7.1 (TypeScript 7.0).
Czy Node.js uruchomi TypeScript bez budowania?
Tak, od 22.18, ale tylko usuwa typy: bez tsconfig, bez paths, bez enumów (dokumentacja Node.js). Do prawdziwego buildu nadal potrzebny jest tsc albo bundler.
Czy warto przenieść projekt z JavaScriptu na TypeScript?
Badanie z lutego 2026 pokazało, że agenci AI piszący w TypeScripcie sięgają po furtkę any 9 razy częściej niż ludzie, a mimo to ich pull requesty są akceptowane 1,8 raza częściej (Lee i in., 2026). Typy pomagają agentom tylko wtedy, gdy surowe reguły nie pozwalają im wyłączyć sprawdzania. Migruję plik po pliku z agentami AI, którzy pracują według narzuconych reguł. Najpierw testy utrwalają obecne zachowanie, potem włączam strict katalog po katalogu, a każdy merge zatwierdza człowiek, więc wdrożenia mogą iść dalej w trakcie migracji. W styczniu 2024 włączyłem TypeScript w Workerach Cloudflare jednego produktu, a w marcu 2026 podniosłem backend do TypeScriptu 6, w którym CommonJS jest przestarzały.

Bonus · #suchar

Suchar na deser

Gratis, jak pierwsza rozmowa. To samo poczucie humoru dostajesz w pakiecie z projektem.

Co powiedział TypeScript JavaScriptowi na pierwszej randce?Puenta

„Wybacz, nie jesteś w moim typie”. Ba‑dum‑tss.

Jak w TypeScripcie nazywa się typ spod ciemnej gwiazdy?Puenta

any. Ba‑dum‑tss.

Dlaczego programista TypeScript jest dobrym swatem?Puenta

Bo od razu zna Twój typ. Ba‑dum‑tss.

W 30 minut sprawdzisz, czy do siebie pasujemy

Ty przynosisz problem, ja pytania. Chcesz najpierw liczbę? Konfigurator pokaże godziny, widełki ceny i termin startu.

albo napisz na ciunkos@gmail.com

Po umówieniu dostajesz zaproszenie do kalendarza. Nic więcej do wypełniania.

Moja obietnica

  • Odpowiedź w 24 godziny. Odpowiadam w ciągu 24 godzin w dni robocze. Osobiście, nie bot. Wiadomości z weekendu: do poniedziałku, do 12:00.
  • Spóźnienie znaczy gratis. Jeśli się spóźnię, pierwsza godzina pracy jest za darmo. Nie musisz o to prosić.
  • Zakres na piśmie w 24 godziny. Bezpłatna rozmowa 30 minut bez prezentacji firmy, potem zakres i cena na piśmie w ciągu 24 godzin. Ty decydujesz.
  • Osoba, która wykona pracę. Rozmawiasz z osobą, która wykona pracę. Bez warstwy sprzedaży, bez przekazywania dalej.
  • Odzywam się tylko z czymś nowym. Odzywam się tylko wtedy, gdy mam dla Ciebie coś nowego. Nigdy „czy jest już decyzja?”.
  • Uczciwe „to nie dla mnie”. Jeśli nie jestem właściwą osobą, mówię to na rozmowie i wskazuję kogoś, kto jest.

Rozmowy w tym tygodniu · start pracy 3 listopada 2026 · Kontrakt B2B · Wrocław, zdalnie

Kod, domena i konta są Twoje od pierwszego dnia. Nic nie trzymam jako zakładnika.