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.
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ą
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:
// 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);
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:
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.
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:
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.
// 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.
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.
// 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ł");
Wartość towaru: 139.60 zł
Co tu się dzieje, fragment po fragmencie
| Fragment | Znaczenie |
|---|---|
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.
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.
Cztery nieporozumienia, które warto od razu wyprostować
| Co się często słyszy | Jak 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
Do tej lekcji nie potrzebujesz komputera z zainstalowanym środowiskiem — wystarczy kartka albo edytor tekstu. Środowisko postawimy w lekcji 2.
Poniższy kod JavaScript wypisuje w konsoli coś zupełnie innego, niż spodziewał się autor. Ustal, co się wypisze, i wyjaśnij dlaczego.
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.
Spójrz na nagłówek funkcji i odpowiedz na pytania, nie zaglądając do jej wnętrza:
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.
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.
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.
Co trzeba zapamiętać
- TypeScript = JavaScript + opis typów sprawdzany przed uruchomieniem programu.
- Typ podaje się po dwukropku:
const cena: number = 3.5; - Kompilator
tscsprawdza typy i zamienia plik.tsna.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.