TypeScript: podstata jazyka, přísné typování a React Native

Autor: IT Sectr Publikováno: 2026-02-10 Doba čtení: 12 min

TypeScript — přísně typovaná nadstavba nad JavaScriptem, vyvinutá společností Microsoft. Přidává systém typů, rozhraní, generika a dekorátory, přičemž zachovává plnou kompatibilitu s existujícím JS kódem. Díky kontrole typů ve fázi kompilace předchází TypeScript celé třídě chyb v React Native, Angularu a dalších frameworkách. Podle State of JS Survey (2025) používá TypeScript 78 % dotázaných vývojářů. Více v dokumentaci TypeScript.

Hlavní

  • TypeScript — statické typování nad JS s kontrolou ve fázi kompilace
  • Rozhraní — kontrakty pro tvary objektů s volitelnými poli
  • Generika — zobecněné typy pro funkce a třídy
  • React Native — 65 % nových projektů používá TypeScript pro typování props a stavu
  • tsc — kompilátor překládající TS do JS beze změny runtime

Co je TypeScript?

TypeScript — programovací jazyk od Microsoftu (2012), vyvinutý Andersem Hejlsbergem (tvůrcem C# a Turbo Pascalu). TypeScript rozšiřuje JavaScript o statický typový systém, rozhraní, generika, výčty a dekorátory. Kód v TS je kompilován do čistého JavaScriptu (transpilace) pomocí kompilátoru tsc nebo Babel — výstupem je standardní JS fungující v jakémkoli prostředí.

Motivace vytvoření TypeScript — omezení JavaScriptu ve velkých projektech. Dynamické typování JS vede k chybám, které jsou odhaleny až za běhu: undefined is not a function, Cannot read property of null. TypeScript přesouvá kontrolu typů do fáze kompilace a předchází těmto chybám před spuštěním kódu. Čím větší je projekt, tím významnější jsou výhody TS: v kódové základně o 100 000+ řádcích TS předchází stovkám potenciálních chyb.

Klíčová vlastnost TypeScript — přísné typování s volitelným příznakem strict: true v tsconfig.json. V přísném režimu jsou zapnuty všechny kontroly: strictNullChecks (null/undefined jsou nekompatibilní s jinými typy), noImplicitAny (zakazuje implicitní any), strictFunctionTypes (kontravariance parametrů funkcí). Ve výchozím nastavení se strict: true doporučuje pro všechny nové projekty.

TypeScript vs JavaScript

TypeScript se liší od JavaScriptu pouze ve fázi vývoje. Po kompilaci jsou typy vymazány — runtime spouští běžný JS bez ztráty výkonu. Je to kompromis: vývoj vyžaduje další krok kompilace, ale poskytuje automatické doplňování v IDE, refaktorování s přejmenováním symbolů a dokumentaci typů přímo v kódu.

AspektJavaScriptTypeScript
TypováníDynamické, runtimeStatické, compile-time
Přípona souboru.js.ts (nebo .tsx pro React)
Chyby typůOdhaleny za běhuOdhaleny před spuštěním
GenerikaNeAno (generické typy)
RozhraníNe (pouze JSDoc)Ano (interface + type)
KompilaceNení vyžadovánaJe vyžadována (tsc / Babel)

Systém typů TypeScript

Systém typů TypeScript — strukturální (structural typing), ne nominativní: dva typy jsou kompatibilní, pokud jejich struktura odpovídá, bez ohledu na název. To se liší od Java/C#, kde kompatibilita je určena názvem třídy nebo rozhraní. Strukturální typování zjednodušuje integraci s existujícím JS kódem — není třeba deklarovat implements pro každý typ.

Základní a pokročilé typy

TypeScript podporuje primitivní typy JS plus: any (vypnutí kontroly), unknown (bezpečné any — vyžaduje kontrolu před použitím), never (nikdy nevrací), void (bez návratu), tuple (tuple pevné délky), enum (výčet), union (string | number), intersection (A & B), literal ('red' | 'blue'), index signature ([key: string]: number).

typescript
// Základní systém typů TypeScript
// Primitivní typy
const name: string = 'React Native';
const version: number = 0.73;
const isReady: boolean = true;

// Union a Literal typy
type Platform = 'ios' | 'android' | 'web';
type Status = 'idle' | 'loading' | 'success' | 'error';

function getSDKVersion(platform: Platform): number {
  switch (platform) {
    case 'ios': return 17;
    case 'android': return 34;
    case 'web': return 2025;
  }
}

// Tuple — tuple pevné délky
type Coordinate = [number, number];
const position: Coordinate = [55.75, 37.61];

// Enum — výčet s autoinkrementem
enum AppState {
  Background,
  Foreground,
  Inactive
}

// Unknown — bezpečná alternativa k any
function parseJSON(json: string): unknown {
  return JSON.parse(json);
}

const data = parseJSON('{"name":"TS"}');
if (typeof data === 'object' && data !== null) {
  console.log((data as Record<string, unknown>).name);
}

Typ Platform — union řetězcových literálů omezující hodnoty na tři varianty. Pokud je předáno 'windows', TypeScript vyhodí chybu. Tuple Coordinate zaručuje přesně dvě čísla — to je vhodné pro souřadnice nebo RGB barvy. Enum AppState je kompilován do objektu s reverzním mapováním. Unknown vynucuje kontrolu typu před použitím — na rozdíl od any je unknown ve výchozím nastavení bezpečný.

Rozhraní a type-aliasy

Rozhraní (interface) a type-aliasy (type) v TypeScript popisují tvar objektů. Rozhraní mohou být sloučena (declaration merging — opětovná deklarace přidává pole) a rozšířena (extends). Type-aliasy mohou popisovat union, intersection, tuple a podmíněné typy, ale nepodporují declaration merging. Pravidlo: používejte interface pro API objekty, type — pro všechno ostatní.

typescript
// Rozhraní a typy pro React Native
// Rozhraní s volitelnými poli
interface User {
  id: string;
  name: string;
  email: string;
  avatar?: string; // volitelné pole
  readonly createdAt: Date; // pouze pro čtení
}

// Rozšíření rozhraní (extends)
interface AdminUser extends User {
  role: 'admin';
  permissions: string[];
}

// Typ pro API data
type ApiResponse<T> = {
  data: T;
  status: Status;
  error?: string;
};

// Utility types — Partial činí všechna pole volitelnými
type PartialUser = Partial<User>;

// Pick — vybírá zadaná pole
type UserPreview = Pick<User, 'id' | 'name' | 'avatar'>;

// Record — slovník s typovanými klíči
type UserMap = Record<string, User>;

Rozhraní User s ? (volitelné pole) a readonly (pouze pro čtení). ApiResponse<T> — generické rozhraní pro API odpovědi. Partial<User> — utilitní typ, který činí všechna pole volitelnými (užitečné pro editační formuláře). Pick<User, 'id' | 'name'> vybírá pouze zadaná pole — vhodné pro náhledové komponenty. Record<string, User> — slovník uživatelů podle ID.

Generika a utilitní typy

Generika (Generics) — jedna z klíčových funkcí TypeScript, umožňující vytvářet komponenty pracující s libovolnými typy bez ztráty typové bezpečnosti. Generická funkce je definována s parametrem typu v úhlových závorkách: function identity<T>(arg: T): T. Typ T je odvozen automaticky z argumentu nebo uveden explicitně: identity<string>('hello').

Utilitní typy — vestavěná generika pro transformaci typů: Partial<T> (všechna pole volitelná), Required<T> (všechna pole povinná), Readonly<T> (všechna pole pouze pro čtení), Pick<T, K> (výběr polí), Omit<T, K> (vyloučení polí), Record<K, T> (slovník), Exclude<T, U> (vyloučení union), Extract<T, U> (extrakce union), NonNullable<T> (vyloučení null/undefined).

typescript
// Generika v TypeScript
// Generická funkce pro práci s API
async function fetchData<T>(url: string): Promise<T> {
  const response = await fetch(url);

  if (!response.ok) {
    throw new Error(`HTTP ${response.status}`);
  }

  return response.json() as Promise<T>;
}

// Použití s konkrétním typem
interface Product {
  id: number;
  title: string;
  price: number;
}

const products = await fetchData<Product[]>('/api/products');

// Generická třída pro správu stavu
class StateManager<S> {
  private state: S;

  constructor(initial: S) {
    this.state = initial;
  }

  getState(): S {
    return this.state;
  }

  updateState(partial: Partial<S>): void {
    this.state = { ...this.state, ...partial };
  }
}

// Typovaná práce s Redux Reducer
type Action<T, P> = {
  type: T;
  payload: P;
};

type UserAction =
  | Action<'SET_USER', User>
  | Action<'CLEAR_USER', undefined>
  | Action<'UPDATE_USER', Partial<User>>;

Funkce fetchData<T> — typovaný obal kolem fetch. Parametr T určuje tvar odpovědi: při volání fetchData<Product[]> TypeScript ví, že vrácené pole obsahuje objekty Product. Třída StateManager<S> spravuje stav libovolného typu — Partial<S> pro částečnou aktualizaci. Action<T, P> — discriminated union pro Redux akce s automatickým zužováním typu v switch.

TypeScript v React Native

TypeScript v React Native zajišťuje přísné typování props a stavu komponent. React Native CLI vytváří šablonu s příponou .tsx a tsconfig.json. PropTypes (JS) jsou nahrazeny TypeScript rozhraními — kontrola probíhá ve fázi kompilace, ne za běhu. styled-components a React Navigation mají plné typy.

Typování komponenty

React.FC<Props> — typ funkční komponenty s props. Děti (children) jsou automaticky typovány. useRef<T> — reference na nativní komponentu. useState<S> — stav s odvozením typu. useNavigation<T> — typovaná navigace. useCallback, useMemo — s automatickým odvozením typů. Všechny React hooky jsou plně typovány.

typescript
// Typovaná React Native komponenta
import React, { useState, useCallback } from 'react';
import {
  View, Text, FlatList, TouchableOpacity,
  StyleSheet
} from 'react-native';
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';

// Typy pro navigaci a data
type RootStackParamList = {
  Home: undefined;
  Profile: { userId: string };
  Settings: undefined;
};

type NavigationProp =
  NativeStackNavigationProp<RootStackParamList, 'Home'>;

// Rozhraní pro props
interface ProductListProps {
  products: Product[];
  onSelect: (id: number) => void;
}

// Typovaná funkční komponenta
const ProductList: React.FC<ProductListProps> = ({
  products,
  onSelect
}) => {
  const navigation = useNavigation<NavigationProp>();
  const [selectedId, setSelectedId] = useState<number | null>(null);

  const handlePress = useCallback((id: number) => {
    setSelectedId(id);
    onSelect(id);
    navigation.navigate('Profile', { userId: String(id) });
  }, [onSelect, navigation]);

  const renderItem = useCallback(({ item }: { item: Product }) => (
    <TouchableOpacity onPress={() => handlePress(item.id)}>
      <Text>{item.title}</Text>
      <Text>${item.price.toFixed(2)}</Text>
    </TouchableOpacity>
  ), [handlePress]);

  return (
    <FlatList
      data={products}
      renderItem={renderItem}
      keyExtractor={(item) => String(item.id)}
    />
  );
};

Typ RootStackParamList — slovník tras s jejich parametry. NavigationProp — typovaná navigace: navigation.navigate('Profile', { userId }) kontroluje, že Profile přijímá userId. useCallback s typovanými parametry zabraňuje zbytečným renderům. FlatList je typován přes generikum: — data a renderItem získávají typy automaticky.

Nástroje vývojáře TypeScript

Nástroje TypeScript zahrnují kompilátor tsc, tsconfig.json, podporu IDE ve VS Code, ESLint s @typescript-eslint, Prettier a DefinitelyTyped (@types/*). tsc — kompilátor převádějící .ts na .js. tsconfig.json — konfigurace: target (ES2020), module (ESNext), strict: true, outDir (výstupní složka). sourceMap — ladění TS v prohlížeči pomocí map kódu.

DefinitelyTyped — repozitář s typizacemi pro knihovny bez vestavěných typů. Instalace: npm install @types/react @types/react-native --save-dev. Soubory .d.ts — deklarace typů. Moderní knihovny (React, React Native, Angular) obsahují vestavěné typy a nevyžadují @types/. Pro staré JS knihovny je DefinitelyTyped jediným zdrojem typů.

json
// tsconfig.json — minimální konfigurace
{
  "compilerOptions": {
    "target": "esnext",
    "module": "commonjs",
    "strict": true,
    "jsx": "react-native",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "noEmit": true // pouze kontrola, bez generování JS
  },
  "include": ["src/**/*.ts", "src/**/*.tsx"],
  "exclude": ["node_modules", "babel.config.js"]
}

Volba strict: true zapíná všechny kontroly typů — doporučena pro všechny projekty. jsx: 'react-native' zachovává JSX bez transformace (React Native zpracovává JSX přes Babel). moduleResolution: 'node' — vyhledávání modulů jako v Node.js. esModuleInterop — kompatibilita s CommonJS moduly. noEmit: true — pouze kontrola bez generování JS souborů (Babel nebo Metro generují JS).

Často kladené dotazy

Co je TypeScript?

TypeScript — přísně typovaná nadstavba nad JavaScriptem od Microsoftu (2012). Přidává statické typování, rozhraní, generika, výčty a dekorátory. Kompiluje se do čistého JS přes tsc. Kompatibilní s libovolným JS kódem. Používá se v React Native (~65 % nových projektů), Angularu a Node.js. Vyvinut Andersem Hejlsbergem (tvůrcem C#).

Proč se TypeScript používá v React Native?

TypeScript zajišťuje přísné typování props a stavu React komponent — chyby typů jsou odhaleny ve fázi kompilace, ne za běhu. Automatické doplňování IDE funguje pro všechny knihovny. Generika typují složité struktury (Redux store, API). React Navigation má plné typování tras. Podle průzkumů používá TypeScript 78 % JS vývojářů.

Jak se TypeScript kompiluje do JavaScriptu?

Kompilátor tsc parsuje .ts/.tsx soubory, kontroluje typy, odstraňuje anotace a generuje .js. Target (ES5, ES2020) je nastaven v tsconfig.json. TypeScript nemění runtime — vymazané typy neovlivňují výkon. Source mapy spojují zkompilovaný JS s původním TS pro ladění. Babel s @babel/preset-typescript — alternativa k tsc.

Jaké datové typy podporuje TypeScript?

TypeScript zahrnuje všechny JS typy: string, number, boolean, null, undefined, symbol, any. Přidává: void, never, unknown, tuple, enum, union (string | number), intersection (A & B), literal ('red' | 'blue'), Record, Pick, Omit, Partial, Required, Readonly, Extract, Exclude, NonNullable. Generika vytvářejí zobecněné typy: Array<number>, Promise<string>, Map<string, User>.

Jaké nástroje jsou potřeba pro vývoj v TypeScript?

Kompilátor tsc je součástí npm balíčku typescript. VS Code — IDE s nativní podporou TS, automatickým doplňováním, refaktorováním. tsconfig.json konfiguruje přísný režim. ESLint s @typescript-eslint/parser — statická analýza. Prettier — formátování. DefinitelyTyped (@types/*) — typy pro knihovny bez vestavěné podpory. React Native CLI obsahuje TypeScript šablonu.

Shrnutí

  • TypeScript — statické typování nad JS s kompilací do čistého JS přes tsc
  • Rozhraní a type-aliasy popisují tvary objektů s volitelnými a readonly poli
  • Generika — zobecněné typy pro funkce, třídy a utilitní typy (Partial, Pick, Record)
  • React Native — přísné typování props, stavu a navigace přes RootStackParamList
  • strict: true — povinná volba tsconfig.json pro všechny nové projekty
  • DefinitelyTyped — @types/ balíčky s typizacemi pro knihovny bez vlastních typů
  • 78 % vývojářů používá TypeScript podle State of JS (2025)

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také