03.07 Rest parametry
Výuka
Proč rest parametry?
Dosud jsme viděli funkce s pevným počtem parametrů. Ale co když nevíš, kolik argumentů bude předáno?
// ❌ Musíš znát přesný počet
const sum2 = (a, b) => a + b;
const sum3 = (a, b, c) => a + b + c;
// A co když chceš sčítat 10 čísel?
Rest parametry (ES6+) umožňují funkci přijmout libovolný počet argumentů:
// ✅ Funguje s jakýmkoli počtem argumentů
const sum = (...numbers) => numbers.reduce((a, b) => a + b, 0);
sum(1, 2); // 3
sum(1, 2, 3, 4, 5); // 15
Proč je to užitečné?
- Flexibilní funkce - nemusíš znát počet argumentů dopředu
- Čistší API -
Math.max(1, 2, 3, 4)místoMath.max([1, 2, 3, 4]) - Skutečné pole - na rozdíl od starého
argumentsobjektu
Představ si to jako: Balíček "všechno ostatní". Když posíláš dárky, první je pro maminku, druhý pro tátu, a zbytek (...rest) pro sourozence.
Jak to funguje?
1. Napíšeš ...nazev jako POSLEDNÍ parametr: function(...args) { }
2. Všechny "zbývající" argumenty se sbalí do POLE
3. Můžeš kombinovat s běžnými parametry: function(first, ...rest) { }
4. Rest MUSÍ být poslední - jinak JavaScript neví, kde končí rest
Důležité:
- Rest parametr je skutečné pole (Array), ne objekt jako starý
arguments - Můžeš používat pole metody:
map,filter,reduceatd. - Funguje s arrow funkcemi (arguments ne!)
Klíčové koncepty
- ... (tři tečky) - rest operator sbírá zbylé argumenty do pole
- Musí být poslední -
function(a, ...rest, b)nefunguje! - Je to pole - můžeš volat
rest.map(),rest.lengthatd. - Rest vs arguments - rest je modernější, čistší, funguje všude
JavaScript
Příklad 1: Základní rest parametr
const sum = function(...numbers) {
console.log(numbers); // Je to pole!
return numbers.reduce((a, b) => a + b, 0);
};
console.log(sum(1, 2, 3));
// numbers = [1, 2, 3]
// → 6
console.log(sum(1, 2, 3, 4, 5));
// numbers = [1, 2, 3, 4, 5]
// → 15
console.log(sum(5));
// numbers = [5]
// → 5
console.log(sum());
// numbers = []
// → 0
Co se stalo?
...numberssbírá všechny argumenty do pole- Pole může být prázdné (
[]) pokud nepředáš žádné argumenty - Můžeš použít jakékoli pole metody (
reduce,map,filter)
Příklad 2: Kombinace běžných parametrů a rest
const greetAll = function(greeting, ...names) {
console.log("greeting:", greeting); // První argument
console.log("names:", names); // Zbylé argumenty jako pole
return names.map(name => greeting + " " + name);
};
console.log(greetAll("Hello", "Alice", "Bob", "Charlie"));
// greeting: "Hello"
// names: ["Alice", "Bob", "Charlie"]
// → ["Hello Alice", "Hello Bob", "Hello Charlie"]
Co se stalo?
- První parametr (
greeting) dostane první argument - Rest parametr (
...names) dostane všechno ostatní - Rest musí být poslední - nemůžeš psát
function(...names, greeting)
Příklad 3: Rest parametr je skutečné pole
const max = function(...numbers) {
// Můžeš používat pole metody
console.log(numbers.length); // Počet argumentů
console.log(numbers[0]); // První číslo
console.log(numbers.includes(5)); // Obsahuje 5?
return Math.max(...numbers); // Spread operator
};
console.log(max(1, 5, 3, 9, 2));
// → 9
Co se stalo?
...numbersje skutečné pole (Array)- Můžeš volat jakékoliv pole metody:
map,filter,reduce,includes,lengthatd. - To je obrovská výhoda oproti starému
arguments!
Příklad 4: Porovnání se starým arguments
Starý způsob - arguments (před ES6):
function oldSum() {
// arguments NENÍ pole!
console.log(Array.isArray(arguments)); // false
// Musíš ho převést na pole
const nums = Array.from(arguments);
return nums.reduce((a, b) => a + b, 0);
}
Nový způsob - rest parameters (ES6+):
const newSum = function(...numbers) {
// numbers JE pole!
console.log(Array.isArray(numbers)); // true
// Můžeš rovnou použít metody
return numbers.reduce((a, b) => a + b, 0);
};
Co se stalo?
argumentsje objekt, ne pole - musíš ho převádět...restje pole - můžeš rovnou používat metodyargumentsnefunguje v arrow funkcích,...restfunguje všude!
Příklad 5: Rest s arrow funkcemi
// ✅ Rest funguje s arrow funkcemi
const sum = (...nums) => nums.reduce((a, b) => a + b, 0);
// ❌ arguments NEFUNGUJE s arrow funkcemi
const badSum = () => {
return arguments.reduce((a, b) => a + b, 0); // Error: arguments is not defined
};
Příklad 6: Praktický příklad - logger
const log = function(level, ...messages) {
const timestamp = new Date().toISOString();
const combined = messages.join(" ");
console.log(`[${timestamp}] [${level}] ${combined}`);
};
log("INFO", "Server", "started", "successfully");
// → [2025-12-18T10:30:00.000Z] [INFO] Server started successfully
log("ERROR", "Database", "connection", "failed");
// → [2025-12-18T10:30:01.000Z] [ERROR] Database connection failed
Co se stalo?
- První parametr (
level) je povinný - Rest (
...messages) sbírá všechny další argumenty - Spojíme je pomocí
join(" ")do jednoho textu
TypeScript
V TypeScriptu musíš specifikovat typ pole pro rest parametr:
// Rest parametr s typem number[]
const sum = function(...numbers: number[]): number {
return numbers.reduce((a, b) => a + b, 0);
};
// Rest parametr s typem string[]
const greetAll = function(greeting: string, ...names: string[]): string[] {
return names.map(name => greeting + " " + name);
};
// TypeScript kontroluje typy
sum(1, 2, 3); // ✅ OK
sum("a", "b"); // ❌ Error: Argument of type 'string' is not assignable to parameter of type 'number'
greetAll("Hi", "Alice", "Bob"); // ✅ OK
greetAll("Hi", 1, 2); // ❌ Error: čísla nejsou string
TypeScript kontroluje:
- ✅ Typ prvků v poli - všechny argumenty musí být správného typu
- ✅ Pozice rest parametru - musí být poslední
- ✅ Použití pole metod - ví, že rest je pole
Rozdíl JS vs TS
JavaScript:
const sum = function(...numbers) {
return numbers.reduce((a, b) => a + b, 0);
};
sum(1, 2, 3); // 6 ✅
sum("1", "2", "3"); // "0123" ⚠️ (string concatenation, ne chyba!)
sum(1, "2", true); // "102true" ⚠️ (wtf?!)
TypeScript:
const sum = function(...numbers: number[]): number {
return numbers.reduce((a, b) => a + b, 0);
};
sum(1, 2, 3); // 6 ✅
sum("1", "2", "3"); // ❌ Error: Argument of type 'string' is not assignable to parameter of type 'number'
sum(1, "2", true); // ❌ Error: smíšené typy
Tip
💡 Vždy používej rest místo arguments:
// ❌ Starý způsob - arguments
function oldWay() {
const args = Array.from(arguments); // Musíš převádět
return args.reduce((a, b) => a + b);
}
// ✅ Nový způsob - rest
const newWay = (...args) => args.reduce((a, b) => a + b);
💡 Rest musí být poslední:
// ❌ Nefunguje - rest není poslední
function bad(...rest, last) { // SyntaxError!
}
// ✅ Funguje - rest je poslední
function good(first, ...rest) {
console.log(first); // První argument
console.log(rest); // Všechno ostatní
}
💡 Kombinuj s destrukturováním pro čistější kód:
const log = function(level, ...messages) {
const [first, ...others] = messages; // Destrukturování
console.log(`[${level}] ${first}`);
if (others.length > 0) {
console.log("Additional:", others.join(", "));
}
};
log("INFO", "Server started", "port 3000", "ready");
// → [INFO] Server started
// → Additional: port 3000, ready
Kvíz
Co platí o rest parametru?
❌ - Rest parametr MUSÍ být poslední! function(...rest, x) je chyba
✅ - Rest sbírá zbylé argumenty do skutečného pole (Array)
❌ - Rest parametr je součástí ES6 (JavaScript), ne jen TypeScriptu
❌ - Rest je pole, arguments je objekt - úplně jiné!
🎯 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
- 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
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ě