
Grzegorz Kalmus
Autor
TypeScript to jeden z najważniejszych języków programowania ostatniej dekady. Jeśli pracujesz z JavaScriptem i jeszcze nie korzystasz z TypeScripta, ten artykuł pokaże Ci, dlaczego warto to zmienić – i jak zacząć bez bólu.
Co to jest TypeScript?
TypeScript to nadzbiór JavaScriptu (superset) stworzony przez Microsoft, który dodaje do JS statyczne typowanie oraz zaawansowane funkcje języka obiektowego. Oznacza to, że każdy poprawny kod JavaScript jest też poprawnym kodem TypeScript – możesz więc migrować stopniowo, plik po pliku.
TypeScript kompiluje się do czystego JavaScriptu, który działa w każdej przeglądarce i środowisku Node.js. Sam TS nie trafia do produkcji – to tylko narzędzie dla programistów. Dlatego nie ma żadnego narzutu wydajnościowego w czasie działania aplikacji.
Projekt jest open source, dostępny na GitHub firmy Microsoft, i cieszy się ogromną popularnością – ponad 100 000 gwiazdek na GitHubie i dziesiątki milionów pobrań miesięcznie przez npm.
Dlaczego TypeScript dominuje w 2024 roku?
Liczby mówią same za siebie. Według ankiety State of JS, TypeScript od lat utrzymuje ponad 90% wskaźnik satysfakcji wśród programistów JavaScript – to jeden z najwyższych wyników w całej ekosystemie JS. Jednocześnie liczba pobrań pakietu typescript z npm rośnie nieprzerwanie rok do roku, przekraczając w 2024 roku 60 milionów tygodniowych pobrań.
Praktycznie wszystkie duże frameworki i biblioteki – Angular, React, Vue, Next.js, NestJS – oferują pełne wsparcie dla TypeScripta lub wręcz są napisane w TS. Pracodawcy coraz częściej wymagają znajomości TypeScripta jako standardowej umiejętności front-end dewelopera.
Kluczowe funkcje TypeScripta
Statyczne typowanie
Podstawowa cecha TypeScripta to możliwość deklarowania typów zmiennych, parametrów funkcji i wartości zwracanych. Kompilator sprawdza typy podczas kompilacji, zanim kod trafi do przeglądarki.
// JavaScript - brak kontroli typow
function add(a, b) {
return a + b;
}
add(5, "10"); // "510" - cichy blad!
// TypeScript - blad wykryty w edytorze
function add(a: number, b: number): number {
return a + b;
}
// Blad kompilacji: Argument of type string is not assignable to parameter of type number
Interfejsy i typy złożone
TypeScript pozwala definiować struktury danych za pomocą interfejsów i aliasów typów. To nieocenione przy pracy z API, bazami danych czy złożonymi obiektami konfiguracyjnymi.
interface User {
id: number;
name: string;
email: string;
role: "admin" | "editor" | "viewer";
createdAt: Date;
}
function getUserDisplayName(user: User): string {
return user.name + " (" + user.role + ")";
}
Generyki
Generyki pozwalają pisać kod wielokrotnego użytku, który działa z różnymi typami danych, zachowując pełną kontrolę typów.
function getFirstItem<T>(arr: T[]): T | undefined {
return arr[0];
}
const firstNumber = getFirstItem([1, 2, 3]); // typ: number
const firstName = getFirstItem(["a", "b", "c"]); // typ: string
Enumeracje
Enumy pozwalają definiować zestawy nazwanych stałych, co znacznie poprawia czytelność kodu:
enum OrderStatus {
Pending = "PENDING",
Processing = "PROCESSING",
Shipped = "SHIPPED",
Delivered = "DELIVERED",
Cancelled = "CANCELLED"
}
Wnioskowanie typów
TypeScript nie wymaga jawnego podawania typów wszędzie. Kompilator potrafi sam wywnioskować typy z kontekstu. Dzięki temu kod jest zwięzły, ale nadal bezpieczny typowo:
const count = 42; // TypeScript wie, ze to number
const name = "Studio"; // TypeScript wie, ze to string
const items = [1, 2, 3]; // TypeScript wie, ze to number[]
TypeScript kontra JavaScript – praktyczne porównanie
Pytanie TS czy JS pojawia się na początku każdego projektu. Oto zestawienie kluczowych różnic:
- Wykrywanie błędów: JS – w czasie wykonania (użytkownik widzi błąd); TS – w czasie kompilacji (deweloper widzi błąd w edytorze)
- Dokumentacja kodu: JS – brak wbudowanej; TS – typy są żywą dokumentacją
- Refaktoryzacja: JS – ryzykowna, łatwo coś zepsuć; TS – bezpieczna, kompilator wyłapie niespójności
- Autouzupełnianie: JS – ograniczone; TS – pełne IntelliSense w VS Code
- Próg wejścia: JS – niższy; TS – wyższy, ale inwestycja się zwraca
Jakie błędy TypeScript zapobiega?
To jest prawdziwa wartość TypeScripta – eliminacja całych klas błędów, które w JS wykrywamy dopiero na produkcji:
Błąd: wywołanie metody na null/undefined
// JavaScript - crash na produkcji
function displayUser(user) {
console.log(user.name.toUpperCase()); // TypeError jesli user = null
}
// TypeScript - blad w edytorze
function displayUser(user: User | null) {
// Blad: Object is possibly null
if (user) {
console.log(user.name.toUpperCase()); // OK
}
}
Błąd: literówka w nazwie właściwości
interface Product {
price: number;
title: string;
}
const product: Product = { price: 99, title: "Kurs TS" };
console.log(product.titel);
// Blad: Property titel does not exist on type Product. Did you mean title?
TypeScript w React i Next.js
Przy tworzeniu stron internetowych w oparciu o React i Next.js, TypeScript jest wręcz standardem. Oto typowe zastosowania:
Typowanie propsów komponentu React
interface ButtonProps {
label: string;
onClick: () => void;
variant?: "primary" | "secondary" | "ghost";
disabled?: boolean;
}
const Button: React.FC<ButtonProps> = ({
label,
onClick,
variant = "primary",
disabled = false
}) => {
return (
<button onClick={onClick} disabled={disabled} className={"btn btn-" + variant}>
{label}
</button>
);
};
Typowanie hooków i stanu
interface CartItem {
id: number;
name: string;
price: number;
quantity: number;
}
const [cart, setCart] = useState<CartItem[]>([]);
const [loading, setLoading] = useState<boolean>(false);
const [error, setError] = useState<string | null>(null);
Typowanie w Next.js App Router
// app/produkty/[id]/page.tsx
interface PageProps {
params: { id: string };
}
export default async function ProductPage({ params }: PageProps) {
const product = await fetchProduct(params.id);
return <ProductDetails product={product} />;
}
Podstawy konfiguracji – tsconfig.json
Plik tsconfig.json steruje zachowaniem kompilatora TypeScript. Kluczowe opcje dla projektu Next.js:
{
"compilerOptions": {
"target": "ES2020",
"strict": true,
"allowJs": true,
"skipLibCheck": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"jsx": "preserve",
"paths": {
"@/*": ["./*"]
}
}
}
Kluczowe opcje:
- strict: true – włącza pełen tryb rygorystyczny (zalecane)
- target – do jakiej wersji JS kompiluje TS
- paths – aliasy importów (np. @/components zamiast ../../components)
Migracja z JavaScript do TypeScript – podejście stopniowe
Nie musisz przepisywać całego projektu na raz. TypeScript obsługuje podejście stopniowe:
- Zainstaluj TypeScript: npm install –save-dev typescript @types/node @types/react
- Utwórz tsconfig.json: npx tsc –init
- Włącz allowJs: true – TypeScript będzie kompilował też pliki .js
- Zmieniaj pliki po kolei: Zmieniaj rozszerzenia .js na .ts lub .jsx na .tsx
- Dodawaj typy stopniowo: Używaj any tam, gdzie jeszcze nie masz czasu typować
- Włącz strict: true – na końcu, gdy większość kodu jest już stypowana
Narzędzia – VS Code, ESLint, Prettier
TypeScript świetnie integruje się z ekosystemem narzędzi deweloperskich. Pełna dokumentacja dostępna jest na typescriptlang.org/docs.
Visual Studio Code ma wbudowane wsparcie dla TypeScripta bez instalowania żadnych wtyczek. Dzięki temu zyskujesz:
- Autouzupełnianie kodu z podpowiedziami typów
- Podświetlanie błędów na bieżąco w edytorze
- Refaktoryzację – zmiana nazwy zmiennej we wszystkich plikach
- Nawigację do definicji (go to definition)
- Podgląd dokumentacji dla bibliotek
Instalacja ESLint z pluginem TypeScript:
npm install --save-dev @typescript-eslint/parser @typescript-eslint/eslint-plugin
Wydajność – czy TypeScript spowalnia aplikację?
Krótka odpowiedź: nie. TypeScript kompiluje się do czystego JavaScriptu – typy, interfejsy i inne konstrukcje TS są usuwane podczas kompilacji. W przeglądarce działa wyłącznie JS, identyczny jak napisany ręcznie. Jedyna zmiana dotyczy czasu kompilacji podczas budowania projektu, ale nowoczesne narzędzia jak esbuild czy SWC kompilują TS błyskawicznie.
Kiedy TypeScript to zły wybór?
Mimo wszystkich zalet, są sytuacje, gdy TypeScript jest przerostem formy nad treścią:
- Małe skrypty jednorazowe – szybki skrypt Node.js do przetworzenia pliku CSV nie wymaga typowania
- Prototypy i proof-of-concept – gdy sprawdzasz pomysł i nie zamierzasz dalej rozwijać kodu
- Projekty z bardzo prostą logiką – statyczna strona HTML bez żadnej logiki biznesowej
- Gdy zespół nie zna TS – lepszy JS dobrze napisany niż TS z any wszędzie
Krzywa uczenia się
TypeScript ma niższy próg wejścia niż wiele osób myśli. Znając JavaScript, możesz zacząć od prostych adnotacji typów i stopniowo odkrywać bardziej zaawansowane funkcje. Pierwsze dwa tygodnie mogą być frustrujące – kompilator wskazuje błędy, których wcześniej nie widziałeś. Ale to właśnie jest wartość TypeScripta: te błędy i tak istniały, tylko nie wiedziałeś o nich.
Po miesiącu większość deweloperów nie wyobraża sobie powrotu do czystego JS w większych projektach.
Podsumowanie
TypeScript to dziś standard w profesjonalnym tworzeniu aplikacji webowych. Daje Ci wykrywanie błędów zanim kod trafi do użytkownika, lepsze narzędzia deweloperskie i autouzupełnianie, bezpieczną refaktoryzację dużych baz kodu, żywą dokumentację przez typy i zero narzutu wydajnościowego na produkcji.
Jeśli chcesz zlecić stworzenie projektu z użyciem TypeScripta, Next.js i nowoczesnych technologii webowych, zapoznaj się z naszą ofertą cennikową lub skontaktuj się z nami – chętnie porozmawiamy o Twoim projekcie.

