1.10 Type Inference vs Annotations
Výuka
TypeScript má 2 způsoby, jak určit typ proměnné:
| Způsob | Jak funguje | Kdy použít |
|---|---|---|
| Inference (odvození) | TS odvodí typ z hodnoty automaticky | Když je typ zřejmý |
| Annotation (anotace) | Explicitně napíšeš typ | Když TS neví, nebo chceš být explicitní |
JavaScript
JavaScript nemá statické typy, takže inference ani annotations neexistují:
// JavaScript - žádné typy
let name = 'Jan'; // prostě proměnná
let age = 25;
let isActive = true;
// Typ se může změnit
name = 123; // ✅ OK (ale možná nechceš)
TypeScript
Type Inference (odvození)
TS automaticky odvodí typ z přiřazené hodnoty:
// TS odvodí typy sám
let name = 'Jan'; // name: string
let age = 25; // age: number
let isActive = true; // isActive: boolean
let numbers = [1, 2, 3]; // numbers: number[]
// Funguje i pro objekty
let user = {
name: 'Jan',
age: 25
};
// user: { name: string; age: number; }
// A funkce
function add(a: number, b: number) {
return a + b; // návratový typ: number (odvozeno)
}
// Inference z kontextu
const numbers = [1, 2, 3];
numbers.map(n => n * 2); // n: number (odvozeno z pole)
Type Annotations (explicitní typy)
Někdy musíš typ napsat explicitně:
// Explicitní typ
let name: string = 'Jan';
let age: number = 25;
let isActive: boolean = true;
// Kdy je nutné: deklarace bez inicializace
let value: string; // bez anotace by bylo 'any'
value = 'hello';
// Funkce s explicitními typy
function greet(name: string): string {
return `Hello, ${name}`;
}
// Komplexní typy
let user: { name: string; age: number };
user = { name: 'Jan', age: 25 };
// Union types
let id: string | number;
id = 123; // ✅ OK
id = 'abc'; // ✅ OK
// Arrays
let numbers: number[] = [1, 2, 3];
let items: Array<string> = ['a', 'b'];
Kdy použít co?
✅ Používej Inference (nech TS odvodit)
// Typ je zřejmý z hodnoty
const name = 'Jan'; // inference: string
const age = 25; // inference: number
const active = true; // inference: boolean
// Z funkčních volání
const upper = 'hello'.toUpperCase(); // inference: string
const len = 'hello'.length; // inference: number
✅ Používej Annotations (nap iš typ)
// 1. Deklarace bez inicializace
let user: User; // musíš napsat typ
user = getUser();
// 2. Funkční parametry (vždy!)
function greet(name: string) { // parametr MUSÍ mít typ
return `Hello, ${name}`;
}
// 3. Návratový typ funkce (doporučeno)
function calculate(): number { // explicitní návrat
return 42;
}
// 4. Komplexní typy
const config: { theme: string; debug: boolean } = {
theme: 'dark',
debug: true
};
Rozdíl JS vs TS
// JavaScript - žádné typy
let x = 5;
x = 'hello'; // ✅ OK
// TypeScript - Inference
let x = 5; // x: number (odvozeno)
// x = 'hello'; // ❌ Error
// TypeScript - Annotation
let y: number = 5;
// y = 'hello'; // ❌ Error
Tip
💡 Preferuj Inference:
// ❌ Zbytečně explicitní
const name: string = 'Jan';
const age: number = 25;
// ✅ Nech TS odvodit
const name = 'Jan';
const age = 25;
💡 Vždy typuj parametry funkcí:
// ❌ Špatně - 'any' type
function greet(name) {
return `Hello, ${name}`;
}
// ✅ Dobře - explicitní typ
function greet(name: string) {
return `Hello, ${name}`;
}
💡 Explicitní návratový typ u veřejných funkcí:
// ✅ Doporučeno pro API/veřejné funkce
export function calculate(x: number, y: number): number {
return x + y;
}
Kvíz
Které výroky jsou pravdivé?
✅ - Inference = automatické odvození typu
✅ - Parametry musí mít typ (jinak jsou any)
❌ - JS nemá statické typy
✅ - TS odvodí number z hodnoty 5
🎯 Závěrečný projekt
Po dokončení všech 8 dílů vytvoříte jednoduchou Todо aplikaci v čistém JavaScriptu. Naučíte se, jak aplikovat vše, co jste se naučili, na reálný projekt.
Zobrazit podrobnosti projektu →Informace o seriálu
Obtížnost
Délka
Cca 480 minut
Počet videí
8 videí + projekty
Certifikát
Po dokončení obdržíte certifikát
Lekce v této sekci
- 1.1 Úvod do JavaScriptu a TypeScriptu
- 1.2 Nastavení prostředí
- 1.3 První program
- 1.4 Proměnné: var, let, const
- 1.5 Datové typy - přehled
- 1.6 String (řetězce)
- 1.7 Number (čísla)
- 1.8 Boolean (pravda/nepravda)
- 1.9 Null a Undefined
- 1.10 Type Inference vs Annotations
- 1.11 Aritmetické operátory
- 1.12 Porovnávací operátory
- 1.13 Logické operátory
- 1.14 Komentáře
- 1.15 Console metody
Struktura lekcí (souborový strom)
- 1.1 Úvod do JavaScriptu a TypeScriptu
- 1.2 Nastavení prostředí
- 1.3 První program
- 1.4 Proměnné: var, let, const
- 1.5 Datové typy - přehled
- 1.6 String (řetězce)
- 1.7 Number (čísla)
- 1.8 Boolean (pravda/nepravda)
- 1.9 Null a Undefined
- 1.10 Type Inference vs Annotations
- 1.11 Aritmetické operátory
- 1.12 Porovnávací operátory
- 1.13 Logické operátory
- 1.14 Komentáře
- 1.15 Console metody
- 03.01 Deklarace funkce
- 03.02 Function Expression
- 03.03 Arrow Functions
- 03.04 Parametry a argumenty
- 03.05 Return hodnoty
- 03.06 Výchozí parametry
- 03.07 Rest parametry
- 03.08 Co je Scope
- 03.09 Lexikální Scope
- 03.10 Řetězec Scope
- 03.11 Globální Scope
- 03.12 Životní Cyklus Proměnných
- 03.13 Omezení Scope
- 03.14 Použití Closures
- 03.15 Callback funkce
- 03.16 Higher-order Functions
- 03.17 IIFE
- 03.18 Void funkce
- 03.19 Rekurze
- v přípravě
- v přípravě
- v přípravě
- v přípravě
- 01 — Co je Next.js
- 02 — Vytvoření projektu
- 03 — Struktura projektu (app/)
- 04 — Page komponenty (page.js / page.tsx)
- 05 — Layout komponenty (layout.js / layout.tsx)
- 06 — File-based routing
- 07 — Dynamické routy ([id]/page.js)
- 08 — Link komponenta (navigace)
- 09 — Image komponenta (next/image)
- 10 — Metadata (title, description, Open Graph)
- 11 — Loading UI (loading.js / loading.tsx)
- 12 — Error handling (error.js / error.tsx)
- 13 — Not Found (not-found.js / not-found.tsx)
- v přípravě
- v přípravě
- v přípravě