JavaScript pozwala dodać liczbę do napisu i nawet nie mrugnie okiem. TypeScript to ten sam język, ale z kontrolerem, który zatrzymuje takie pomysły, zanim program trafi do użytkownika.

TypeScript poziom: start 45 min bez instalacji
CEL LEKCJI

Czego się dziś nauczysz

  • Wyjaśnisz, czym różni się TypeScript od JavaScriptu
  • Wskażesz w kodzie błąd, który wychwyci TypeScript, a JavaScript przepuści
  • Opiszesz, co się dzieje z kodem TS zanim uruchomi go przeglądarka
  • Wymienisz sytuacje, w których typy naprawdę pomagają, i takie, w których przeszkadzają
WPROWADZENIE

Problem, który rozwiązuje TypeScript

Wyobraź sobie sklepik szkolny. Kasjer wpisuje w formularzu liczbę sprzedanych drożdżówek, a program ma policzyć, ile pieniędzy jest w kasie. W czystym JavaScripcie taki kod wygląda niewinnie:

sklepik.js — JavaScript
// dane z formularza zawsze przychodzą jako tekst!
const liczbaSztuk = "12";
const cena = 3.5;

const doZaplaty = liczbaSztuk * cena;   // 42 — działa
const razemSztuk = liczbaSztuk + 5;     // ...a to?

console.log(doZaplaty);
console.log(razemSztuk);
wynik w konsoli
42
125

Pierwsza linia zadziałała, bo przy mnożeniu JavaScript sam zamienił tekst na liczbę. Przy dodawaniu zrobił jednak coś innego: skleił napis "12" z liczbą 5 i wyszło "125". Program się nie wysypał, nie wyświetlił żadnego ostrzeżenia — po prostu policzył źle. Taki błąd znajdziesz dopiero wtedy, gdy ktoś zgłosi, że stan magazynu się nie zgadza.

To nie jest sztuczny przykład

Wszystko, co użytkownik wpisze w pole formularza na stronie, program dostaje jako tekst — nawet jeśli wpisał cyfry. Pomylenie tekstu z liczbą to jeden z najczęstszych błędów w aplikacjach webowych.

TypeScript rozwiązuje to w jeden sposób: każe ci powiedzieć, jakiego rodzaju dane trzymasz, a potem pilnuje, żebyś się tego trzymał. Ten sam kod w TypeScripcie w ogóle się nie skompiluje:

sklepik.ts — TypeScript
const liczbaSztuk: string = "12";
const razemSztuk = liczbaSztuk + 5;
// Błąd: Operator '+' cannot be applied to types 'string' and 'number'.

Redaktor kodu podkreśli tę linię na czerwono, zanim jeszcze uruchomisz program. Błąd znaleziony w trakcie pisania kosztuje minutę. Ten sam błąd znaleziony przez użytkownika kosztuje dużo więcej.

TEORIA

Jak to działa

TypeScript to nadzbiór JavaScriptu. Oznacza to, że każdy poprawny program w JavaScripcie jest jednocześnie poprawnym programem w TypeScripcie — wystarczy zmienić rozszerzenie pliku z .js na .ts. TypeScript tylko dokłada do języka nowe elementy: przede wszystkim zapis typów.

Przeglądarka nie rozumie TypeScriptu

Żadna przeglądarka ani Node.js nie potrafi uruchomić pliku .ts. Zanim to nastąpi, kod musi przejść przez kompilator (program o nazwie tsc), który sprawdza typy i zamienia kod na zwykły JavaScript:

droga kodu od pliku do przeglądarki
  sklepik.ts                  tsc                   sklepik.js
 ┌────────────┐         ┌──────────────┐         ┌────────────┐
 │ kod z      │  ────>  │ 1. sprawdza  │  ────>  │ czysty JS  │  ────>  przeglądarka
 │ typami     │         │    typy      │         │ bez typów  │          / Node.js
 └────────────┘         │ 2. usuwa je  │         └────────────┘
                        └──────────────┘
                               │
                               └──> błędy typów wypisane w terminalu

Zwróć uwagę na krok drugi: kompilator usuwa wszystkie informacje o typach. W gotowym pliku .js nie ma po nich śladu. Typy istnieją wyłącznie na czas pisania i sprawdzania kodu — dlatego mówimy, że TypeScript daje statyczną kontrolę typów.

to samo, przed kompilacją i po niej
// piszesz w TypeScripcie:
function powitaj(imie: string): string {
  return "Cześć, " + imie + "!";
}

// kompilator produkuje JavaScript:
function powitaj(imie) {
  return "Cześć, " + imie + "!";
}

Zapamiętaj tę konsekwencję

Skoro typy znikają po kompilacji, to TypeScript nie sprawdza niczego w trakcie działania programu. Jeśli dane przyjdą z internetu i będą inne, niż obiecałeś w kodzie, program się pomyli tak samo jak zwykły JavaScript. Typy chronią przed twoimi własnymi pomyłkami, nie przed złymi danymi z zewnątrz.

PRZYKŁAD Z OMÓWIENIEM

Sklepik szkolny — wersja z typami

Zobacz ten sam program napisany porządnie. Nie musisz jeszcze rozumieć każdego zapisu — w kolejnych lekcjach omówimy je po kolei. Na razie zwróć uwagę na to, ile informacji o programie da się wyczytać z samego kodu.

sklepik.ts
// 1. Opis pojedynczego produktu w sklepiku
type Produkt = {
  nazwa: string;
  cena: number;
  sztuk: number;
};

// 2. Nasz asortyment
const asortyment: Produkt[] = [
  { nazwa: "drożdżówka", cena: 3.5, sztuk: 12 },
  { nazwa: "sok",        cena: 2.8, sztuk: 20 },
  { nazwa: "kanapka",    cena: 6.0, sztuk: 7  }
];

// 3. Funkcja, która liczy wartość całego towaru
function wartoscMagazynu(produkty: Produkt[]): number {
  let suma = 0;
  for (const p of produkty) {
    suma = suma + p.cena * p.sztuk;
  }
  return suma;
}

// 4. Wypisanie wyniku
const wartosc = wartoscMagazynu(asortyment);
console.log("Wartość towaru: " + wartosc.toFixed(2) + " zł");
wynik w konsoli
Wartość towaru: 139.60 zł

Co tu się dzieje, fragment po fragmencie

FragmentZnaczenie
type Produkt = { … } Tworzymy własną nazwę dla kształtu danych: produkt to coś, co ma nazwę (tekst), cenę (liczbę) i liczbę sztuk (liczbę). Od tej pory możemy pisać po prostu Produkt.
const asortyment: Produkt[] Dwukropek zapowiada typ. Produkt[] to „tablica produktów”. Gdybyś wpisał do tej tablicy liczbę albo produkt bez ceny, kompilator od razu to zgłosi.
function wartoscMagazynu(produkty: Produkt[]): number Funkcja przyjmuje tablicę produktów i obiecuje zwrócić liczbę. Ta obietnica po dwukropku jest sprawdzana — jeśli w środku zwrócisz tekst, będzie błąd.
for (const p of produkty) Pętla przechodząca po kolejnych elementach tablicy. Zmienna p to jeden produkt.
p.cena * p.sztuk Tu widać zysk z typów: po wpisaniu p. edytor sam podpowie nazwa, cena, sztuk. Literówka p.cenna to natychmiastowy błąd.
wartosc.toFixed(2) Zaokrąglenie do dwóch miejsc po przecinku. Edytor wie, że wartosc to liczba, więc podpowiada metody liczb.

Najważniejsza korzyść nie jest widoczna na obrazku

Podpowiedzi edytora. Kiedy typy są opisane, VS Code wie, co można zrobić z każdą zmienną, i podsuwa listę możliwości. Piszesz szybciej i mniej zaglądasz do dokumentacji.

KONTEKST

Gdzie spotkasz TypeScript

Angular

Framework napisany w TypeScripcie i wymagający go w projektach. Jeśli w szkole robisz aplikacje webowe w Angularze, piszesz w TypeScripcie.

React i Vue

Formalnie działają na JavaScripcie, ale w firmach nowe projekty zakłada się dziś zwykle w wariancie z TypeScriptem.

Serwery Node.js

Backend w Express czy NestJS — typy pilnują zgodności danych między bazą, serwerem i aplikacją użytkownika.

Egzamin INF.04

Na egzaminie zwykle piszesz w czystym JavaScripcie, ale cała składnia, której się tu nauczysz, jest w nim identyczna.

Innymi słowy: ucząc się TypeScriptu, uczysz się jednocześnie JavaScriptu. Wszystkie zmienne, pętle, funkcje, klasy i tablice działają dokładnie tak samo — dochodzi tylko warstwa opisu typów.

CZĘSTE BŁĘDY

Cztery nieporozumienia, które warto od razu wyprostować

Co się często słyszyJak jest naprawdę
„TypeScript to zupełnie inny język, muszę uczyć się od nowa” To JavaScript plus zapis typów. Twój kod w JS zadziała w pliku .ts bez żadnych zmian.
„TypeScript sprawia, że program działa szybciej” Nie. Po kompilacji zostaje zwykły JavaScript — ani szybszy, ani wolniejszy. Zyskujesz na czasie programisty, nie na czasie wykonania.
„Skoro mam typy, program nie może się wysypać” Może. Typy znikają po kompilacji. Dzielenie przez zero, brak połączenia z siecią albo dziwne dane z serwera są tak samo groźne jak wcześniej.
„Trzeba dopisywać typ do każdej zmiennej” Nie trzeba i nie warto. TypeScript sam rozpoznaje typ z wartości — o tym będzie lekcja 3.
ZADANIA

Zadania

Do tej lekcji nie potrzebujesz komputera z zainstalowanym środowiskiem — wystarczy kartka albo edytor tekstu. Środowisko postawimy w lekcji 2.

ZAD 1Detektyw★☆☆

Poniższy kod JavaScript wypisuje w konsoli coś zupełnie innego, niż spodziewał się autor. Ustal, co się wypisze, i wyjaśnij dlaczego.

zagadka.js
const oceny = ["5", "4", "3"];
let suma = 0;
for (const ocena of oceny) {
  suma += ocena;
}
console.log("Suma ocen: " + suma);
pokaż rozwiązanie
Suma ocen: 0543

Oceny są zapisane jako tekst (w cudzysłowach), a suma zaczyna się od liczby 0. Pierwsze dodawanie 0 + "5" zamienia całość na tekst "05", kolejne dopisują następne znaki. Zamiast dodawania mamy sklejanie napisów.

W TypeScripcie kompilator odrzuciłby zapis suma += ocena, bo suma jest liczbą, a ocena tekstem.

ZAD 2Czytanie ze zrozumieniem★☆☆

Spójrz na nagłówek funkcji i odpowiedz na pytania, nie zaglądając do jej wnętrza:

frag.ts
function czyZdal(punkty: number, prog: number): boolean
  • Ile argumentów trzeba podać i jakiego rodzaju?
  • Co funkcja zwraca?
  • Czy wywołanie czyZdal("50", 30) się skompiluje?
  • Czy wywołanie czyZdal(50) się skompiluje?
pokaż rozwiązanie

Dwa argumenty, oba liczbowe. Funkcja zwraca wartość logiczną — prawdę albo fałsz. czyZdal("50", 30) nie skompiluje się, bo pierwszy argument jest tekstem. czyZdal(50) też nie — brakuje drugiego argumentu.

Zwróć uwagę, że wszystkie te odpowiedzi dało się podać bez oglądania kodu funkcji. Na tym polega wartość typów w większym projekcie.

ZAD 3Opisz dane★★☆

Wzorując się na typie Produkt z przykładu, napisz na kartce własny typ Uczen, który opisuje: imię, nazwisko, klasę (np. „3TI”), średnią ocen oraz informację, czy jest w samorządzie. Dobierz odpowiedni rodzaj danych do każdego pola.

pokaż przykładowe rozwiązanie
type Uczen = {
  imie: string;
  nazwisko: string;
  klasa: string;
  srednia: number;
  wSamorzadzie: boolean;
};

Klasa to string, mimo że zaczyna się od cyfry — „3TI” zawiera litery, więc liczbą być nie może. Średnia musi być number, bo ma część dziesiętną. Przynależność do samorządu ma tylko dwie możliwości, więc pasuje boolean.

ZAD 4Dyskusja w parach★★☆

Znajdźcie po jednym argumencie dla każdej strony:

  • Dlaczego zespół pięćdziesięciu programistów pracujących nad jednym systemem bankowym prawie na pewno wybierze TypeScript?
  • Dlaczego ktoś, kto pisze dwudziestolinijkowy skrypt do jednorazowego użytku, prawdopodobnie zostanie przy JavaScripcie?
pokaż wskazówki

Duży zespół: nikt nie zna całego kodu na pamięć. Typy działają jak instrukcja obsługi cudzych funkcji i chronią przed przypadkowym zepsuciem czegoś w odległym module przy drobnej zmianie.

Mały skrypt: TypeScript wymaga konfiguracji i kroku kompilacji. Przy dwudziestu linijkach ten koszt jest większy niż zysk — całość ogarniasz wzrokiem.

PODSUMOWANIE

Co trzeba zapamiętać

  • TypeScript = JavaScript + opis typów sprawdzany przed uruchomieniem programu.
  • Typ podaje się po dwukropku: const cena: number = 3.5;
  • Kompilator tsc sprawdza typy i zamienia plik .ts na .js.
  • Po kompilacji typy znikają — nie chronią przed błędnymi danymi w czasie działania programu.
  • Największe zyski: wcześnie wykryte pomyłki, podpowiedzi edytora i czytelność cudzego kodu.

W następnej lekcji

Instalujemy Node.js, kompilator TypeScriptu i VS Code, a potem uruchamiamy pierwszy własny program. Od lekcji 2 pracujesz już przy komputerze.