Czym jest TypeScript i po co go używać
JavaScript potrafi skleić tekst z liczbą, choć autor chciał dodawać. TypeScript pomaga wykrywać niezgodność z zadeklarowanym typem — ale nie odgadnie wszystkich zamiarów programisty.
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. Liczba sprzedanych drożdżówek została odczytana jako tekst, a program ma obliczyć wartość zakupów. Poniższy przykład to JavaScript: zapisz go w osobnym pliku sklepik.js i uruchom node sklepik.js.
// Symulujemy liczbę sztuk odczytaną 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
Tekst z pliku lub konsoli może zawierać cyfry, ale nadal być tekstem. W tej lekcji zapisujemy go w zmiennej i sprawdzamy, czym różni się sklejanie od dodawania.
TypeScript może wykryć, że wynik nie pasuje do oczekiwanego typu. Samo "12" + 5 jest dozwolone również w TypeScripcie i daje tekst. Błąd pojawi się, gdy jawnie wymagamy liczby:
const liczbaSztuk: string = "12";
const razemSztuk: number = liczbaSztuk + 5;
// TS2322: wyniku string nie można przypisać do number.
// Poprawka: const razemSztuk = Number(liczbaSztuk) + 5;
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 rozszerza składnię JavaScriptu o opisy typów i inne konstrukcje. Kod JavaScript może po przeniesieniu do pliku .ts zgłaszać błędy typów — zmiana rozszerzenia nie gwarantuje bezbłędnej kompilacji.
Przeglądarka nie rozumie TypeScriptu
W tym kursie używamy tsc: sprawdzamy typy i kompilujemy kod do JavaScriptu, a następnie uruchamiamy go w konsoli Node.js. Nowe wersje Node potrafią również usuwać część składni typów i uruchamiać .ts, ale nie sprawdzają wtedy typów i nie obsługują wszystkich konstrukcji. Dlatego zachowujemy osobny etap kompilacji.
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: 140.00 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
W kolejnym kursie będziesz pisać aplikacje w Angularze 22. Tutaj ćwiczysz sam język, aby później skupić się na elementach frameworka.
React i Vue
React i Vue mogą współpracować z TypeScriptem. Poznane typy i składnia przydają się również poza Angularem.
Serwery Node.js
Backend w Express czy NestJS — typy pilnują zgodności danych między bazą, serwerem i aplikacją użytkownika.
Egzamin INF.04
Zmienne, warunki, pętle i funkcje przydają się w zadaniach programistycznych. TypeScript dodaje też składnię, której nie ma w zwykłym JavaScripcie. Dobór języka na egzaminie zależy od konkretnego zadania i środowiska.
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” | Podstawowe konstrukcje i reguły wykonania pochodzą z JavaScriptu. Kod przeniesiony z JS może jednak wymagać poprawek, aby przejść kontrolę typów. |
| „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 duży zespół pracujący nad wspólnym systemem może skorzystać na opisaniu typów?
- 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.