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 5 Node.js VS Code 60 min przy komputerze
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 pozwala uruchamiać JavaScript poza przeglądarką, prosto z terminala. Kompilator TypeScriptu sam jest programem napisanym w JavaScripcie, więc bez Node.js się nie obejdzie.

Pobierz wersję LTS ze strony nodejs.org i zainstaluj ją, zostawiając ustawienia domyślne. Potem otwórz terminal (w Windows: Terminal lub Wiersz polecenia) i sprawdź, czy wszystko się udało:

terminal
node -v
npm -v
przykładowy wynik
v22.11.0
10.9.0

Numery u ciebie będą inne i to normalne — ważne, żeby pojawiły się dwa numery wersji, a nie komunikat o nierozpoznanym poleceniu. Razem z Node.js instaluje się npm, czyli menedżer pakietów: to nim za chwilę pobierzemy kompilator.

„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 gdzieś na dysku folder kurs-ts i otwórz go w VS Code (Plik → Otwórz folder). Następnie otwórz wbudowany terminal skrótem Ctrl + ` i wykonaj po kolei trzy polecenia:

terminal, w folderze projektu
npm init -y
npm install --save-dev typescript
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 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 kompilator zainstalowany w tym projekcie i pokazuje jego wersję. npx to skrót od „uruchom program z node_modules”.

Dlaczego nie instalujemy TypeScriptu globalnie?

Instalacja w projekcie oznacza, że każdy projekt może mieć własną wersję kompilatora — i że kolega, który skopiuje twój folder, dostanie dokładnie to samo środowisko po jednym poleceniu npm install. Wersja globalna prędzej czy później zacznie się gryźć z jakimś 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

Powstanie plik z kilkudziesięcioma opcjami — prawie wszystkie są wyłączone komentarzem. Nie musisz ich teraz czytać. Zamiast tego zaznacz całą zawartość i zastąp ją tym zestawem, który będzie nam służył przez cały kurs:

tsconfig.json
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "commonjs",
    "rootDir": "./src",
    "outDir": "./dist",
    "strict": true,
    "noUnusedLocals": true,
    "sourceMap": true
  },
  "include": ["src/**/*"]
}
OpcjaZnaczenie
targetJak nowoczesny JavaScript ma powstać. ES2022 rozumie każda dzisiejsza przeglądarka i każdy Node.js.
moduleSposób łączenia plików między sobą. commonjs to wariant, który Node.js uruchomi bez dodatkowej konfiguracji.
rootDirFolder z twoim kodem źródłowym — u nas src.
outDirFolder na gotowy JavaScript — u nas dist. Dzięki temu pliki się nie mieszają.
strictNajważniejsza opcja całego pliku. Włącza pełną, surową kontrolę typów. Zawsze zostawiaj włączoną.
noUnusedLocalsOstrzega o zmiennych, które zadeklarowałeś i nigdy nie użyłeś. Świetnie wyłapuje literówki.
sourceMapTworzy mapę łączącą wynikowy JS z twoim kodem TS — dzięki niej debuger pokazuje linie z pliku .ts.

Nie wyłączaj strict

Kiedy kompilator zaczyna marudzić, kusi, żeby ustawić "strict": false i mieć spokój. To odbieranie sobie jedynego powodu, dla którego używa się TypeScriptu. Wyłączony tryb strict przepuszcza między innymi wartości null tam, gdzie spodziewasz się liczby — i wracasz do błędów z lekcji 1.

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.
  • node dist/index.js uruchomił wynik kompilacji, a nie twój plik źródłowy. Node.js nie umie uruchomić pliku .ts.
  • 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

Dopisz na końcu pliku jedną linijkę i skompiluj ponownie:

src/index.ts — celowy błąd
const komentarz: string = procent;
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 To nie pomyłka: tsc domyślnie generuje plik .js nawet wtedy, gdy znalazł błędy typów. Nigdy nie ignoruj czerwonych komunikatów tylko dlatego, że program się uruchomił.
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★★★

Zmień w tsconfig.json opcję "target" z "ES2022" na "ES5", skompiluj projekt ponownie i porównaj plik dist/index.js z poprzednią wersją. Co się zmieniło i dlaczego? Po zakończeniu przywróć ES2022.

pokaż wyjaśnienie

Przy ES5 kompilator tłumaczy kod na wersję języka z 2009 roku: wszystkie const i let zamieniają się w var. Przy nowszych konstrukcjach dopisałby też sporo dodatkowego kodu zastępczego.

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 typescriptinstaluje 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

Zachowaj ten projekt

Wszystkie kolejne lekcje piszemy w tym samym folderze — wystarczy podmieniać zawartość src/index.ts. Środowisko stawiasz tylko raz.