Typealias — co to je, syntaxe a použití v Kotlinu

Autor: IT Sectr Publikováno: 2026-06-23 Doba čtení: 7 min

Typealias je mechanismus Kotlinu pro vytvoření alternativního názvu existujícího typu. Klíčové slovo typealias umožňuje nahradit složité deklarace typu krátkým a srozumitelným aliasem, aniž by se vytvářel nový typ. Podle dokumentace Kotlinu (2026) typealias zvyšuje čitelnost kódu, zejména v signaturách funkcí s funkčními typy. Typealias činí kód samodokumentujícím, nahrazuje mnohomluvné deklarace srozumitelnými pojmenovanými typy.

Hlavní body

  • Typealias — alias pro existující typ, nevytváří nový typ
  • Funkční typy — typealias nahrazuje složité (T) -> R čitelnými názvy jako Callback
  • Generika — typealias podporuje generické parametry: typealias ListMapper = (T) -> T
  • Vnořené třídy — typealias zkracuje přístup k vnořeným třídám z jiných balíčků
  • Bezpečnost typů — typealias nepřidává kontroly v fázi kompilace, alias je plně zaměnitelný s originálem

Co je typealias?

Typealias (alias typu) — deklarace, která zavádí alternativní název pro existující typ. Syntaxe: typealias NovýNázev = ExistujícíTyp. Po deklaraci lze NovýNázev použít všude, kde se očekává ExistujícíTyp — kompilátor je považuje za stejný typ. Na úrovni bytecode typealias nezanechává stopy: všechny informace o aliasu jsou vymazány ve fázi kompilace.

Hlavním cílem typealias je zlepšení čitelnosti kódu. Místo dlouhé signatury fun process(callback: (Result) -> Unit) lze napsat typealias Callback = (Result) -> Unit a používat Callback jako typ parametru. To je užitečné zejména tehdy, když se stejný funkční typ opakuje na více místech kódu: alias slouží jako jednotný bod definice a dokumentuje účel typu.

Typealias nevytváří nový typ — je pouze synonymem. Proměnné typu Callback a (Result) -> Unit jsou plně zaměnitelné. Kompilátor nevyhodí chybu, pokud je do funkce očekávající Callback předána přímo lambda. Tím se typealias liší od inline class (value class), která vytváří nový typ-obálku s kontrolou ve fázi kompilace. Typealias je přejmenování, nikoli obalení.

Typealias pro funkční typy

Nejčastějším scénářem použití typealias v Kotlinu jsou funkční typy. Dlouhé signatury jako (Int, String) -> Boolean nebo (List) -> Result ztěžují čtení kódu. Typealias je přeměňuje na krátká smysluplná jména, která dokumentují účel funkce: typealias Validator = (String) -> Boolean specifikuje, že se jedná o validátor řetězce.

kotlin
// Bez typealias
fun findUsers(
    filter: (List<User>) -> List<User>
): List<User>

// S typealias
typealias UserFilter = (List<User>) -> List<User>

fun findUsers(filter: UserFilter): List<User>

// Použití ve třídě
typealias OnClickListener = (View) -> Unit

class Button {
    var onClick: OnClickListener = {}
}

V příkladu typealias UserFilter skrývá složitý funkční typ (List) -> List za krátkým názvem. Signatura findUsers se stává čitelnou: «přijímá UserFilter, vrací List». Typealias OnClickListener dělá kód podobným deklaraci rozhraní, ale bez režie vytváření samostatného rozhraní nebo abstraktní třídy. Lambdy a anonymní funkce fungují jako obvykle — typealias nevyžaduje změny ve volajícím kódu.

Typealias s generiky

Typealias podporuje generické parametry, což ho činí ještě flexibilnějším. Lze definovat typealias Mapper = (T) -> R a použít s libovolnými typy. Kompilátor dosazuje konkrétní typy na místo parametrů při každém použití aliasu, přičemž zachovává plnou typovou bezpečnost.

kotlin
// Generický typealias
typealias Mapper<T, R> = (T) -> R
typealias Provider<T> = () -> T
typealias ListTransformer<T> = (List<T>) -> List<T>

fun processNumbers(mapper: Mapper<Int, String>) {
    // typ mapperu je (Int) -> String
}

fun main() {
    val config: Provider<String> = { "default config" }
    val reverse: ListTransformer<Int> = { it.reversed() }
}

Ve výpisu Mapper — generický alias pro libovolnou transformaci z T na R. Provider — poskytovatel hodnoty (továrna bez argumentů). ListTransformer — funkce transformující seznam. Při volání processNumbers(mapper: Mapper) kompilátor rozvine alias na (Int) -> String. Generika dělají z typealias univerzální nástroj vhodný pro jakýkoli kontext bez duplikace deklarací.

Typealias pro vnořené třídy a dlouhé názvy

Vnořené třídy a dlouhé parametrizované typy — další oblast, kde typealias výrazně zjednodušuje kód. Pokud je třída hluboko v hierarchii vnoření (Outer.Inner.Nested), odkazování na ni plným názvem zahlcuje kód. Typealias tento přístup zkracuje a činí ho čitelnějším. To je důležité zejména pro třídy z knihoven třetích stran s dlouhými názvy.

kotlin
// Alias pro vnořenou třídu
class NetworkResponse {
    class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error

// Alias pro dlouhý typ knihovny
typealias UserId = Long
typealias JsonMap = Map<String, Any?>

fun process(error: NetworkError) {
    println("${error.code}: ${error.message}")
}

fun parseJson(data: JsonMap): UserId {
    return data["id"] as? Long ?: 0L
}

V příkladu NetworkError — alias pro vnořenou třídu NetworkResponse.Error. Při importu typealias lze NetworkError používat jako běžný typ, aniž by se odhalovala hierarchie vnoření. JsonMap dokumentuje, že mapa představuje JSON objekt. UserId vysvětluje účel Long v konkrétním kontextu — čtenář okamžitě chápe, že se jedná o identifikátor uživatele, nikoli libovolné číslo. Typealias však nechrání před předáním obyčejného Long tam, kde se očekává UserId — k tomu je potřeba value class.

Typealias vs inline class: rozdíly

Typealias a inline class (value class) řeší různé úkoly, i když oba zavádějí nový název pro typ. Typealias je jen synonymum: proměnná typu UserId = Long přijímá jakýkoli Long bez kontroly. Inline class obaluje hodnotu do nového typu, který je kontrolován ve fázi kompilace: předání obyčejného Long tam, kde se očekává inline class UserId, není možné bez explicitní konverze.

VlastnostTypealiasInline class
Nový typNe — synonymum origináluAno — nový typ s kontrolami
VýkonŽádný — zcela vymazánŽádný — obálka odstraněna v bytecode
DědičnostNeNe (final class)
Vlastní metodyNeAno — lze deklarovat funkce
Bezpečnost typůNe — zaměnitelný s originálemAno — kompilátor rozlišuje typy

Tabulka ukazuje rozdíl mezi oběma mechanismy. Typealias je vhodný pro krátké názvy a dokumentaci kódu, když není vyžadována striktní typizace. Inline class přes klíčové slovo value class (dříve inline class) je potřeba, když je důležité rozlišovat sémanticky odlišné hodnoty stejného primitivního typu. Například UserId a OrderId jsou oba Long, ale předání jednoho tam, kde se očekává druhý, je logická chyba, které value class zabraňuje ve fázi kompilace.

Často kladené otázky

Čím se liší typealias od import alias?

Import alias (import com.example.LongName as Short) funguje na úrovni importu — zkracuje název pouze v aktuálním souboru. Typealias deklaruje globální alias dostupný v celém projektu po importu.

Lze použít typealias k vytvoření rekurzivního typu?

Ano, typealias podporuje rekurzivní definice pro funkční typy, ale s opatrností: typealias Rec = (T) -> Rec funguje, ale rekurzivní odkazy na object — ne. Kompilátor kontroluje cykly a vyhazuje chybu pro nekonečné definice.

Ovlivňuje typealias výkon?

Ne, typealias je zcela vymazán ve fázi kompilace. V bytecode a runtime se používá původní typ bez jakékoli obálky. Výkon je identický s přímým použitím původního typu.

Jaká je maximální úroveň vnoření pro typealias?

Typealias může odkazovat na jiný typealias — to se nazývá řetězec aliasů. Hloubka řetězce formálně není omezena, ale pro čitelnost se doporučuje maximálně 2–3 úrovně. Kompilátor řetězec plně rozvine ve fázi analýzy.

Lze deklarovat typealias uvnitř funkce?

Ne, typealias je deklarace nejvyšší úrovně nebo člen třídy/objektu. Uvnitř funkcí nelze typealias deklarovat. Pro lokální zkrácení typů použijte import alias uvnitř souboru nebo vyčleňte typealias na úroveň modulu.

Shrnutí

  • Typealias — synonymum pro existující typ, nevytváří nový typ a je vymazán při kompilaci
  • Funkční typy — hlavní oblast použití: typealias nahrazuje (T) -> R čitelným názvem jako Callback
  • Generika v typealias umožňují vytvářet generické aliasy Mapper pro libovolné typy
  • Vnořené třídy — typealias zkracuje přístup k hluboce vnořeným typům a dlouhým názvům z knihoven
  • Bezpečnost typů chybí: typealias je plně zaměnitelný s původním typem
  • Value class — alternativa k typealias, když je potřeba striktní kontrola typů s nulovými náklady za běhu
  • Čitelnost — hlavní výhoda: smysluplné názvy typů činí kód samodokumentujícím bez režie

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é