2.4 Switch
Výuka
Kdy použít switch místo if/else?
Představ si, že máš proměnnou, která může mít několik konkrétních hodnot a pro každou chceš udělat něco jiného:
// if/else - opakující se vzor
if (day === "monday") { /*...*/ }
else if (day === "tuesday") { /*...*/ }
else if (day === "wednesday") { /*...*/ }
// ... 7x to samé
Switch je pro tento případ čitelnější:
switch (day) {
case "monday": /*...*/ break;
case "tuesday": /*...*/ break;
// ...
}
Anatomie switch
switch (výraz) {
case hodnota1:
// kód pro hodnota1
break;
case hodnota2:
// kód pro hodnota2
break;
default:
// kód když nic nesedí
}
Klíčové části:
switch (výraz)- výraz, jehož hodnota se porovnávácase hodnota:- pokud výraz === hodnota, začne se zdebreak- ukončí switch (jinak "propadne" do dalšího case!)default- volitelný, provede se když nic nesedí
Pozor na break!
Bez break kód propadne do dalšího case:
const fruit = "apple";
switch (fruit) {
case "apple":
console.log("Jablko");
// Chybí break!
case "banana":
console.log("Banán");
break;
}
// Výstup: "Jablko" A "Banán" - oboje!
JavaScript
// Základní switch
const day = "wednesday";
switch (day) {
case "monday":
console.log("Pondělí - začátek týdne");
break;
case "tuesday":
console.log("Úterý");
break;
case "wednesday":
console.log("Středa - polovina týdne");
break;
case "thursday":
console.log("Čtvrtek");
break;
case "friday":
console.log("Pátek - hurá!");
break;
default:
console.log("Víkend");
}
// Sdílení kódu mezi case (fall-through)
const month = 2;
let season;
switch (month) {
case 12:
case 1:
case 2:
season = "zima";
break;
case 3:
case 4:
case 5:
season = "jaro";
break;
case 6:
case 7:
case 8:
season = "léto";
break;
case 9:
case 10:
case 11:
season = "podzim";
break;
default:
season = "neplatný měsíc";
}
console.log(season); // "zima"
// Switch s výrazem
const score = 85;
switch (true) { // Trik: porovnávej s true
case score >= 90:
console.log("A");
break;
case score >= 80:
console.log("B");
break;
case score >= 70:
console.log("C");
break;
default:
console.log("F");
}
// Switch používá === (striktní porovnání)
const value = "1";
switch (value) {
case 1:
console.log("číslo 1");
break;
case "1":
console.log("string '1'"); // ✅ Toto se provede
break;
}
// Switch s bloky (pro lokální proměnné)
switch (action) {
case "create": {
const newItem = createItem();
save(newItem);
break;
}
case "delete": {
const id = getId();
remove(id);
break;
}
}
TypeScript
// Základní switch s typy
type Day = "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | "saturday" | "sunday";
function getDayMessage(day: Day): string {
switch (day) {
case "monday":
return "Začátek týdne";
case "friday":
return "Konečně pátek!";
case "saturday":
case "sunday":
return "Víkend!";
default:
return "Běžný den";
}
}
// Exhaustive checking - TS kontroluje, že jsi pokryl vše
type Status = "pending" | "approved" | "rejected";
function handleStatus(status: Status): string {
switch (status) {
case "pending":
return "Čeká na schválení";
case "approved":
return "Schváleno";
case "rejected":
return "Zamítnuto";
default:
// Toto by se nikdy nemělo stát
const _exhaustiveCheck: never = status;
return _exhaustiveCheck;
}
}
// Pokud přidáš nový status a zapomeneš ho do switch:
// type Status = "pending" | "approved" | "rejected" | "cancelled";
// TypeScript ti vyhodí chybu u default větve!
// Discriminated unions - switch je ideální
interface Circle {
kind: "circle";
radius: number;
}
interface Rectangle {
kind: "rectangle";
width: number;
height: number;
}
type Shape = Circle | Rectangle;
function getArea(shape: Shape): number {
switch (shape.kind) {
case "circle":
// TypeScript ví, že shape je Circle
return Math.PI * shape.radius ** 2;
case "rectangle":
// TypeScript ví, že shape je Rectangle
return shape.width * shape.height;
}
}
// Switch s enum
enum Color {
Red = "RED",
Green = "GREEN",
Blue = "BLUE"
}
function getColorHex(color: Color): string {
switch (color) {
case Color.Red:
return "#FF0000";
case Color.Green:
return "#00FF00";
case Color.Blue:
return "#0000FF";
}
}
Rozdíl JS vs TS
| JavaScript | TypeScript |
|---|---|
| Žádná kontrola pokrytí | Exhaustive checking s never |
| Libovolné typy v case | TS kontroluje kompatibilitu typů |
| Chyby za běhu | Chyby při kompilaci |
Discriminated unions + switch je silná kombinace v TS:
type Action =
| { type: "INCREMENT" }
| { type: "DECREMENT" }
| { type: "SET"; value: number };
function reducer(state: number, action: Action): number {
switch (action.type) {
case "INCREMENT":
return state + 1;
case "DECREMENT":
return state - 1;
case "SET":
return action.value; // TS ví, že action má value
}
}
Tip
💡 Vždy používej break (pokud záměrně nechceš fall-through):
// ❌ Zapomenutý break
switch (x) {
case 1:
doSomething();
// break; ← chybí!
case 2:
doSomethingElse(); // Provede se i pro x === 1!
}
// ✅ Explicitní fall-through s komentářem
switch (x) {
case 1:
case 2:
// Oba případy dělají totéž
doSomething();
break;
}
💡 Pro jednoduché mapování hodnot použij objekt:
// ❌ Zbytečně dlouhý switch
switch (status) {
case "pending": return "Čeká";
case "approved": return "Schváleno";
case "rejected": return "Zamítnuto";
}
// ✅ Lookup objekt - kratší a rychlejší
const statusLabels = {
pending: "Čeká",
approved: "Schváleno",
rejected: "Zamítnuto"
};
return statusLabels[status] ?? "Neznámý";
💡 Používej bloky {} pro lokální proměnné:
switch (action) {
case "create": {
const item = new Item(); // Lokální pro tento case
break;
}
case "delete": {
const item = findItem(); // Jiná lokální proměnná
break;
}
}
Kvíz
Které výroky jsou pravdivé?
❌ - Switch používá === (striktní porovnání, bez coercion)
✅ - Bez break kód propadne (fall-through) do dalšího case
❌ - default je volitelný, ale doporučený
✅ - TS s exhaustive checking varuje, když nějaká hodnota chybí
🎯 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
- 2.1 If / else
- 2.2 Else if
- 2.3 Ternární operátor
- 2.4 Switch
- 2.5 For cyklus
- 2.6 While a do-while
- 2.7 For...of
- 2.8 For...in
- 2.9 Break a continue
- 2.10 Truthy a Falsy hodnoty
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ě