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.

TypeScript 6.0 Node.js VS Code 60 min przy komputerze

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.

CEL LEKCJI

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
KROK 1

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:

terminal
node -v
npm -v
przykładowy wynik
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.

KROK 2

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.

terminal, w folderze projektu
npm init -y
npm pkg set type=module
npm install --save-dev typescript@~6.0.0 @types/node@24
npx tsc --version
PolecenieCo 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.

KROK 3

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:

terminal
npx tsc --init

Generator tworzy konfigurację z domyślnymi opcjami. Zastąp całą zawartość poniższą konfiguracją do naszego kursu konsolowego:

tsconfig.json
{
  "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"
  ]
}
OpcjaZnaczenie
targetWybieramy wynikową składnię ES2022 obsługiwaną przez używany Node.js 24. target nie dodaje brakujących funkcji biblioteki do starego środowiska.
moduleNodeNext dopasowuje moduły do Node.js. Pole "type": "module" w package.json ustala ESM. Od lekcji 25 będziemy pisać import i export.
rootDirFolder z twoim kodem źródłowym — u nas src.
outDirFolder na gotowy JavaScript — u nas dist. Dzięki temu pliki się nie mieszają.
strictWłą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ą.
noEmitOnErrorNie tworzy nowych plików JavaScript, jeśli kompilator zgłasza błąd. Wcześniej utworzone pliki mogą pozostać na dysku.
sourceMapTworzy 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.

KROK 4

Pierwszy program

Utwórz folder src, a w nim plik index.ts. Struktura projektu wygląda tak:

struktura projektu
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:

src/index.ts
// 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:

terminal
npx tsc
node dist/index.js
wynik w konsoli
Punkty:  31 / 40
Wynik:   77.5%
Status:  ZDANY

Co się właśnie stało

  • npx tsc przeczytał tsconfig.json, sprawdził typy w folderze src i zapisał gotowy JavaScript w folderze dist.
  • 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:

Celowy błąd TS2322 — potem zamień procent na String(procent)
const procent = 77.5;
const komentarz: string = procent;
// Celowy TS2322: number nie pasuje do string.
komunikat kompilatora
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.

USPRAWNIENIE

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:

terminal
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:

package.json — fragment
"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.

CZĘSTE BŁĘDY

Kiedy coś nie działa

KomunikatPrzyczyna 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

Zadania

ZAD 1Środowisko gotowe do pracy★☆☆

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.

ZAD 2Wizytówka★☆☆

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("╚══════════════════════════════╝");
ZAD 3Sabotaż kontrolowany★★☆

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ć.

ZAD 4Kalkulator ocen★★☆

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 ? :.

ZAD 5Detektyw konfiguracji★★★

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ć.

PODSUMOWANIE

Ściąga z tej lekcji

PolecenieDziałanie
npm init -yzakłada plik package.json
npm install --save-dev typescript@~6.0.0 @types/node@24instaluje kompilator w projekcie
npx tsc --inittworzy tsconfig.json
npx tsckompiluje src/*.ts do dist/*.js
npx tsc --watchkompiluje automatycznie po każdym zapisie
node dist/index.jsuruchamia gotowy program
npm startkompiluje i uruchamia jednym poleceniem