Witaj w nowym rozdziale naszej przygody w Parku Jurajskim! Wyobraź sobie następującą sytuację: programiści parku stworzyli system kontroli dostępu do zagród dinozaurów, który miał chronić zarówno gości, jak i pracowników. Wszystko działało świetnie, dopóki w pewnym momencie...
1// system-kontroli-dostępu.js
2
3function przyznajDostep(pracownik, poziomDostępu) {
4 if (pracownik.uprawnienia >= poziomDostępu) {
5 return true;
6 }
7 return false;
8}
9
10// W innym miejscu systemu
11const drMalcolm = {
12 imie: "Ian",
13 nazwisko: "Malcolm",
14 rola: "Matematyk"
15 // ups... brak pola 'uprawnienia'!
16};
17
18// Próba dostępu do zagrody dinozaurów
19const dostępDoT_Rex = przyznajDostep(drMalcolm, 5);
20console.log("Dostęp do zagrody T-Rex:", dostępDoT_Rex); // false, ale bez błędu!
21
22// Później w kodzie...
23if (dostępDoT_Rex) {
24 otworz_brame_do_zagrody('t-rex'); // Ta operacja nigdy nie zostanie wykonana
25} else {
26 console.log("Dr Malcolm nie ma dostępu"); // To się wykona, ale nikt nie zauważył błędu
27}Czy zauważyłeś, co poszło nie tak? W obiekcie
drMalcolm zabrakło właściwości uprawnienia, przez co system niepoprawnie odmówił mu dostępu! W JavaScript ta sytuacja nie wygenerowała żadnego błędu - po prostu właściwość uprawnienia była undefined, co przy porównaniu z liczbą dało wynik false.Wyobraź sobie teraz konsekwencje takiej sytuacji w prawdziwym parku dinozaurów:
To właśnie w takich sytuacjach przydaje się TypeScript.
TypeScript to nadzbiór (superset) języka JavaScript, który dodaje opcjonalne statyczne typowanie. Został stworzony przez Microsoft i jest rozwijany jako projekt open source.
Wyobraź sobie TypeScript jako zaawansowany system bezpieczeństwa dla Parku Jurajskiego:
Ta sama sytuacja w TypeScript wyglądałaby tak:
1// system-kontroli-dostępu.ts
2
3// Definiujemy interfejs określający, jak powinien wyglądać obiekt pracownika
4interface Pracownik {
5 imie: string;
6 nazwisko: string;
7 rola: string;
8 uprawnienia: number; // Wymagane pole!
9}
10
11function przyznajDostep(pracownik: Pracownik, poziomDostępu: number): boolean {
12 if (pracownik.uprawnienia >= poziomDostępu) {
13 return true;
14 }
15 return false;
16}
17
18// W innym miejscu systemu
19const drMalcolm = {
20 imie: "Ian",
21 nazwisko: "Malcolm",
22 rola: "Matematyk"
23 // TypeScript wyłapie błąd: Property 'uprawnienia' is missing in type
24 // '{ imie: string; nazwisko: string; rola: string; }' but required in type 'Pracownik'.
25};
26
27// Ta linia spowoduje błąd kompilacji - TypeScript nas ochroni!
28const dostępDoT_Rex = przyznajDostep(drMalcolm, 5);W powyższym przykładzie TypeScript wykryje błąd już na etapie pisania kodu, zanim oprogramowanie zostanie uruchomione. To jak system ostrzegający nas, że drzwi do zagrody są otwarte, zanim dinozaur zdąży uciec!
Podobnie jak system monitoringu w Parku Jurajskim, TypeScript wykrywa potencjalne problemy jeszcze na etapie pisania kodu:
1function nakarmDinozaura(dinozaur: { gatunek: string; dietaTyp: string; }): void {
2 let jedzenie;
3
4 if (dinozaur.dietaTyp === 'roślinożerny') {
5 jedzenie = 'liście paproci';
6 } else if (dinozaur.dietaTyp === 'mięsożerny') {
7 jedzenie = 'mięso';
8 }
9
10 console.log(`Karmienie ${dinozaur.gatunek}a jedzeniem: ${jedzenie}`);
11}
12
13// TypeScript ostrzeże, że literówka 'roslinozerca' nie pasuje do żadnego warunku
14const triceratops = { gatunek: 'Triceratops', dietaTyp: 'roslinozerca' };
15nakarmDinozaura(triceratops);
16// Bez TypeScript ten dinozaur dostałby "undefined" jako jedzenie!TypeScript działa jak dokładny inwentarz wszystkich dinozaurów w parku:
1// Bez TypeScript - co to są za parametry? Co zwraca ta funkcja?
2function utworzWybieg(id, nazwa, pojemnosc, typOgrodzenia) {
3 //
4}
5
6// Z TypeScript - natychmiastowa dokumentacja!
7function utworzWybieg(
8 id: number,
9 nazwa: string,
10 pojemnosc: number,
11 typOgrodzenia: 'standardowe' | 'elektryczne' | 'wzmocnione'
12): { id: number; status: 'aktywny' | 'w budowie' | 'zamknięty' } {
13 //
14 return { id, status: 'w budowie' };
15}Dzięki TypeScript, twoje środowisko programistyczne (IDE) będzie dokładnie wiedzieć, jakie operacje możesz wykonać na danym obiekcie:

To jak mapa Parku Jurajskiego z dokładnymi wskazówkami, gdzie znajdują się poszczególne wybiegi i jakie dinozaury są w nich trzymane.
Kiedy wprowadzasz zmiany w systemie zarządzania parkiem, TypeScript ostrzega cię o wszystkich miejscach, które wymagają aktualizacji:
1// Przed refaktoryzacją
2interface Dinozaur {
3 id: number;
4 gatunek: string;
5 niebezpieczny: boolean;
6}
7
8// Po refaktoryzacji - zmiana typu pola
9interface Dinozaur {
10 id: number;
11 gatunek: string;
12 poziomZagrozenia: number; // od 1 do 10 zamiast boolean
13}
14
15// TypeScript wskaże wszystkie miejsca, gdzie używaliśmy "niebezpieczny"
16// i teraz musimy użyć "poziomZagrozenia"Nawet jeśli używasz zewnętrznych bibliotek napisanych w czystym JavaScript, możesz korzystać z plików definicji typów, które zapewniają podpowiadanie kodu i kontrolę typów:
1// Instalacja typów dla biblioteki do analizy DNA
2// npm install --save-dev @types/dino-dna-analyzer
3
4import { analizujDNA } from 'dino-dna-analyzer';
5
6// Teraz TypeScript zna typy parametrów i zwracanych wartości
7const wynik = analizujDNA({
8 sekwencja: 'ACGTACGT',
9 gatunekBazowy: 'żaba'
10});
11
12console.log(wynik.kompletnosc); // TypeScript zna dostępne polaTypeScript pozwala korzystać z najnowszych funkcji JavaScript, nawet jeśli docelowe środowisko ich nie obsługuje:
1// Użycie nowoczesnej składni JavaScript
2const dinozaury = ['T-Rex', 'Velociraptor', 'Triceratops'];
3const [najgrozniejszy, ...pozostale] = dinozaury;
4
5// Optional chaining i nullish coalescing
6const dane = {
7 park: {
8 // sektor może nie istnieć
9 }
10};
11
12const nazwaSektora = dane.park?.sektor?.nazwa ?? "Nieznany sektor";Jedną z największych zalet TypeScript jest możliwość stopniowego wprowadzania go do istniejących projektów JavaScript:
.jsna.ts// @ts-ignore lub używając typu anyTo jak stopniowe usprawnianie systemów bezpieczeństwa w Parku Jurajskim, sektor po sektorze, zamiast zamykania całego parku na czas modernizacji.
Oczywiście, jak każda technologia, TypeScript ma swoje ograniczenia:
any - można "oszukać" system typów używając any, co niweluje zalety TypeScriptTypeScript sprawdza się najlepiej w następujących scenariuszach:
TypeScript jest jak zaawansowany system bezpieczeństwa dla Parku Jurajskiego:
Dodając typowanie do kodu JavaScript, zyskujesz:
W następnych lekcjach zaczniemy szczegółowo poznawać system typów TypeScript i zobaczymy, jak możemy wykorzystać go do budowania bardziej niezawodnych systemów - takich, które nie pozwoliłyby dinozaurom uciec z parku!