Instalacja, kompilacja i pierwszy program
Stawiamy środowisko od zera: Node.js, kompilator TypeScriptu i VS Code. Na koniec masz działający projekt, w którym zapis pliku od razu przelicza kod — i możesz w nim pracować przez cały kurs.
Praca w konsoli — wspólne zasady kursu
Środowisko: TypeScript 6.0 i Node.js 24 LTS (co najmniej 24.15.0). Każdy pełny przykład uruchamiaj osobno w src/index.ts, zgodnie z lekcją 02. Bloki opisane jako celowy błąd służą do odczytania komunikatu kompilatora; nie powinny się uruchomić. Bloki JavaScript pokazują zachowanie JS, a fragmenty są oznaczone osobno. Celem kursu jest składnia TypeScriptu przed nauką Angulara 22.
Czego się dziś nauczysz
- Zainstalujesz Node.js i sprawdzisz, czy działa
- Założysz projekt TypeScript z własnym plikiem konfiguracyjnym
- Skompilujesz i uruchomisz pierwszy program
- Włączysz tryb, w którym kod przelicza się sam po każdym zapisie
- Rozpoznasz trzy najczęstsze komunikaty o błędach przy starcie
Node.js — silnik, na którym to wszystko stoi
Node.js uruchamia JavaScript w konsoli. W naszym środowisku uruchamia także kompilator tsc, który sprawdza kod TypeScriptu.
Zainstaluj Node.js 24 LTS, co najmniej 24.15.0, ze strony Node.js. Wersja użyta do sprawdzenia kursu to 24.20.0. Następnie otwórz nowy terminal i sprawdź wersje:
node -v
npm -v
v24.20.0
11.x.x (numer Twojego npm może się różnić)
Numer npm może się różnić. Node powinien spełniać podany zakres, a TypeScript w tym kursie ma należeć do linii 6.0. Angular 22.0.x wymaga TypeScriptu >=6.0.0 i <6.1.0; dla kolejnych wydań sprawdzaj oficjalną tabelę zgodności.
„node nie jest rozpoznawane jako polecenie”
Terminal wczytuje listę dostępnych programów przy starcie, więc po instalacji trzeba go zamknąć i otworzyć na nowo. Jeśli to nie pomoże — zainstaluj Node.js ponownie i upewnij się, że opcja dopisania do zmiennej PATH jest zaznaczona.
Zakładamy projekt
Utwórz folder kurs-ts, otwórz go w VS Code i uruchom poniższe polecenia w terminalu. W PowerShell możesz pisać npm.cmd i npx.cmd, jeśli polityka systemu blokuje skrypty npm.ps1.
npm init -y
npm pkg set type=module
npm install --save-dev typescript@~6.0.0 @types/node@24
npx tsc --version
| Polecenie | Co robi |
|---|---|
npm init -y |
Tworzy plik package.json — metrykę projektu z listą używanych narzędzi.
Przełącznik -y oznacza „zgadzam się na wszystkie odpowiedzi domyślne”. |
npm install --save-dev typescript@~6.0.0 @types/node@24 |
Pobiera kompilator do folderu node_modules. --save-dev mówi:
to narzędzie potrzebne przy pisaniu kodu, nie przy jego uruchamianiu u użytkownika. |
npx tsc --version |
Uruchamia lokalnie zainstalowany kompilator. npx może również pobrać brakujący program, dlatego najpierw instalujemy TypeScript w projekcie. |
Dlaczego nie instalujemy TypeScriptu globalnie?
Lokalna instalacja pozwala każdemu projektowi używać własnej wersji. Plik package-lock.json zapisuje konkretne wersje, a npm ci odtwarza je z blokady. Współdziel plik blokady razem z projektem.
tsconfig.json — instrukcja dla kompilatora
Kompilator musi wiedzieć, gdzie szukać kodu, dokąd zapisywać wynik i jak surowo sprawdzać typy.
Wszystko to opisuje plik tsconfig.json. Wygeneruj go poleceniem:
npx tsc --init
Generator tworzy konfigurację z domyślnymi opcjami. Zastąp całą zawartość poniższą konfiguracją do naszego kursu konsolowego:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"moduleDetection": "force",
"rootDir": "./src",
"outDir": "./dist",
"strict": true,
"noEmitOnError": true,
"types": [
"node"
],
"lib": [
"ES2022"
],
"sourceMap": true
},
"include": [
"src/**/*.ts"
]
}
| Opcja | Znaczenie |
|---|---|
target | Wybieramy wynikową składnię ES2022 obsługiwaną przez używany Node.js 24. target nie dodaje brakujących funkcji biblioteki do starego środowiska. |
module | NodeNext dopasowuje moduły do Node.js. Pole "type": "module" w package.json ustala ESM. Od lekcji 25 będziemy pisać import i export. |
rootDir | Folder z twoim kodem źródłowym — u nas src. |
outDir | Folder na gotowy JavaScript — u nas dist. Dzięki temu pliki się nie mieszają. |
strict | Włącza grupę ważnych sprawdzeń typów, w tym braków null i undefined. Nie włącza wszystkich możliwych kontroli; przykładowo noUncheckedIndexedAccess jest osobną opcją. |
noEmitOnError | Nie tworzy nowych plików JavaScript, jeśli kompilator zgłasza błąd. Wcześniej utworzone pliki mogą pozostać na dysku. |
sourceMap | Tworzy mapę łączącą wynikowy JS z twoim kodem TS — dzięki niej debuger pokazuje linie z pliku .ts. |
Nie wyłączaj strict
Nie wyłączaj strict po pierwszym błędzie. Odczytaj komunikat i popraw model albo warunek. Wyłączenie strict odbiera część kontroli, ale nie zamienia TypeScriptu całkowicie w JavaScript bez typów.
Co oznaczają pozostałe ustawienia?
@types/node dostarcza opisy konsoli i innych API Node. types: ["node"] je wybiera, lib: ["ES2022"] opisuje standardową bibliotekę bez DOM. moduleDetection: "force" rozdziela zasięg nazw w plikach. moduleResolution: "NodeNext" ustala wyszukiwanie importów. Po npm init polecenie npm pkg set type=module ustawia tryb ESM.
Do sprawdzenia bez tworzenia JavaScriptu użyj npx tsc --noEmit. Przy własnych eksperymentach z indeksami warto później włączyć noUncheckedIndexedAccess. Nie używaj npx tsc src/index.ts zamiast kompilacji projektu: podanie pliku zmienia sposób uwzględniania tsconfig.
Pierwszy program
Utwórz folder src, a w nim plik index.ts. Struktura projektu wygląda tak:
kurs-ts/
├─ node_modules/ ← pobrane narzędzia (nie ruszamy)
├─ src/
│ └─ index.ts ← tu piszesz
├─ dist/ ← tu kompilator zapisze .js (powstanie sam)
├─ package.json
└─ tsconfig.json
Nie zaczynamy od zwykłego „Hello world” — napiszmy coś, co od razu pokazuje sens typów. Program przelicza punkty z egzaminu zawodowego na wynik procentowy i informację o zdaniu:
// Wynik egzaminu zawodowego — część pisemna
const maksPunktow: number = 40;
const zdobytePunkty: number = 31;
const progZdawalnosci: number = 50; // w procentach
const procent: number = (zdobytePunkty / maksPunktow) * 100;
const zdany: boolean = procent >= progZdawalnosci;
console.log("Punkty: " + zdobytePunkty + " / " + maksPunktow);
console.log("Wynik: " + procent.toFixed(1) + "%");
console.log("Status: " + (zdany ? "ZDANY" : "NIEZDANY"));
Skompiluj projekt i uruchom wynik:
npx tsc
node dist/index.js
Punkty: 31 / 40
Wynik: 77.5%
Status: ZDANY
Co się właśnie stało
npx tscprzeczytałtsconfig.json, sprawdził typy w folderzesrci zapisał gotowy JavaScript w folderzedist.- Uruchamiamy
dist/index.js, czyli wynik kompilacji. Wbudowane uruchamianie części plików .ts w nowych Node nie zastępuje sprawdzania typów przez tsc. - Zajrzyj do
dist/index.js— zobaczysz ten sam kod, ale bez dwukropków i typów. To dowód z lekcji 1: typy znikają.
Sprawdź, że kontrola typów naprawdę działa
Na chwilę zastąp zawartość src/index.ts poniższym samodzielnym przykładem i skompiluj. Po obejrzeniu błędu przywróć poprawny program:
const procent = 77.5;
const komentarz: string = procent;
// Celowy TS2322: number nie pasuje do string.
src/index.ts:13:7 - error TS2322: Type 'number' is not assignable to type 'string'.
Kompilator podaje plik, numer linii i kolumny oraz kod błędu. Tłumaczenie: „próbujesz włożyć liczbę do pudełka opisanego jako tekst”. Usuń tę linię, zanim przejdziesz dalej.
Kody błędów TS są twoim przyjacielem
Wpisanie w wyszukiwarkę samego kodu, na przykład TS2322, prowadzi wprost do wyjaśnień
i przykładów. To dużo skuteczniejsze niż wklejanie całego komunikatu.
Tryb czuwania — koniec z ręczną kompilacją
Wpisywanie npx tsc po każdej zmianie szybko męczy. Kompilator potrafi obserwować pliki
i przeliczać je sam:
npx tsc --watch
Terminal zostaje zajęty i po każdym zapisie pliku pokazuje wynik sprawdzania. Otwórz drugi terminal
(ikona + w panelu terminala) i tam uruchamiaj node dist/index.js.
Tryb czuwania przerywasz skrótem Ctrl + C.
Własne skróty w package.json
Żeby nie pamiętać tych poleceń, dopisz do package.json sekcję scripts:
"scripts": {
"build": "tsc",
"watch": "tsc --watch",
"start": "tsc && node dist/index.js"
}
Od teraz jedno polecenie npm start kompiluje projekt i od razu go uruchamia —
będziemy go używać do końca kursu.
Kiedy coś nie działa
| Komunikat | Przyczyna i rozwiązanie |
|---|---|
Cannot find module '…/dist/index.js' |
Uruchamiasz plik, którego nie ma — kompilacja się nie powiodła albo jej nie było.
Wykonaj npx tsc i przeczytaj komunikaty. |
error TS18003: No inputs were found |
Kompilator nie znalazł żadnego pliku .ts. Sprawdź, czy plik leży w folderze
src i czy ma rozszerzenie .ts, a nie .ts.txt. |
'tsc' is not recognized… |
Piszesz tsc zamiast npx tsc. Bez npx system szuka
kompilatora zainstalowanego globalnie, a my zainstalowaliśmy go w projekcie. |
| Terminal jest w złym folderze | Wszystkie polecenia wykonuj tam, gdzie leży package.json.
Sprawdzisz to poleceniem dir (Windows) lub ls (Linux, macOS). |
| Kod działa mimo błędów | Bez noEmitOnError kompilator może wygenerować JS pomimo błędów. W naszym ustawieniu nie tworzy wtedy nowego wyniku, ale stary dist/index.js może pozostać na dysku. Korzystaj z npm start, które uruchamia program dopiero po udanej kompilacji. |
Zadania
Załóż projekt kurs-ts według instrukcji z tej lekcji: package.json,
zainstalowany TypeScript, tsconfig.json z naszymi ustawieniami, folder src
z plikiem index.ts. Uruchom program i zrób zrzut ekranu terminala z wynikiem.
W pliku src/index.ts napisz program, który wypisuje twoje dane w ramce ze znaków.
Użyj co najmniej trzech zmiennych z jawnie podanym typem: tekstu, liczby i wartości logicznej.
pokaż przykładowe rozwiązanie
const imie: string = "Kacper";
const klasa: string = "3TI";
const rokNauki: number = 3;
const zdanyProbny: boolean = true;
console.log("╔══════════════════════════════╗");
console.log("║ " + imie + " — klasa " + klasa);
console.log("║ Rok nauki: " + rokNauki);
console.log("║ Próbny INF.04: " + (zdanyProbny ? "zdany" : "do poprawy"));
console.log("╚══════════════════════════════╝");
Wprowadź do swojego programu trzy różne błędy, po jednym naraz, i zapisz kod błędu z komunikatu kompilatora oraz jego tłumaczenie własnymi słowami:
- przypisz liczbę do zmiennej opisanej jako
string, - użyj zmiennej, której nigdzie nie zadeklarowałeś,
- wywołaj na liczbie metodę tekstową, na przykład
rokNauki.toUpperCase().
pokaż spodziewane kody błędów
TS2322 — typ podanej wartości nie pasuje do typu zmiennej.
TS2304 — nie znaleziono nazwy (zwykle literówka albo brak deklaracji).
TS2339 — ten typ nie ma takiej właściwości ani metody.
Te trzy kody odpowiadają za większość błędów, które zobaczysz w tym kursie. Warto je zapamiętać.
Napisz program, który ma zapisane w zmiennych cztery oceny cząstkowe i ich wagi, a następnie wypisuje: średnią ważoną z dokładnością do dwóch miejsc po przecinku, ocenę zaokrągloną do liczby całkowitej oraz informację, czy średnia przekroczyła 4,0. Wszystkim zmiennym nadaj jawne typy.
pokaż wskazówki
Średnia ważona to suma iloczynów ocena × waga podzielona przez sumę wag.
Do zaokrąglenia użyj Math.round(…), do formatowania .toFixed(2).
Wynik porównania srednia > 4 jest już wartością typu boolean —
nie musisz pisać żadnego if, wystarczy operator warunkowy ? :.
W osobnym eksperymencie wpisz do src/index.ts const moc = 2 ** 3; console.log(moc);. Operator ** oznacza potęgowanie. Porównaj wynik kompilacji z target ES2022 oraz ES2015. Po ćwiczeniu przywróć ES2022.
pokaż wyjaśnienie
Dla ES2015 kompilator zastąpi 2 ** 3 wywołaniem Math.pow(2, 3). ES2022 pozwala pozostawić operator **. Wynik obu programów to 8. Zmieniamy zapis wynikowego kodu, a nie regułę potęgowania.
To dobrze pokazuje, czym jest target: nie zmienia tego, co program robi,
tylko to, jak stary silnik JavaScriptu wystarczy, żeby go uruchomić.
Ściąga z tej lekcji
| Polecenie | Działanie |
|---|---|
npm init -y | zakłada plik package.json |
npm install --save-dev typescript@~6.0.0 @types/node@24 | instaluje kompilator w projekcie |
npx tsc --init | tworzy tsconfig.json |
npx tsc | kompiluje src/*.ts do dist/*.js |
npx tsc --watch | kompiluje automatycznie po każdym zapisie |
node dist/index.js | uruchamia gotowy program |
npm start | kompiluje i uruchamia jednym poleceniem |