Typealias is een Kotlin-mechanisme voor het maken van een alternatieve naam voor een bestaand type. Het sleutelwoord typealias maakt het mogelijk een complexe type declaratie te vervangen door een korte en begrijpelijke alias, zonder een nieuw type te creëren. Volgens Kotlin-documentatie (2026) verbetert typealias de leesbaarheid van code, vooral in functiehandtekeningen met functionele types. Typealias maakt code zelfdocumenterend door breedsprakige declaraties te vervangen door begrijpelijke benoemde types.
Belangrijkste punten
Typealias (type-alias) — een declaratie die een alternatieve naam introduceert voor een bestaand type. Syntaxis: typealias NieuweNaam = BestaandType. Na declaratie kan NieuweNaam overal worden gebruikt waar BestaandType wordt verwacht — de compiler behandelt ze als hetzelfde type. Op bytecode-niveau laat typealias geen sporen achter: alle informatie over de alias wordt tijdens de compilatiefase gewist.
Het hoofddoel van typealias is het verbeteren van de leesbaarheid van code. In plaats van een lange handtekening fun process(callback: (Result) -> Unit) kan men typealias Callback = (Result) -> Unit schrijven en Callback gebruiken als parametertype. Dit is vooral nuttig wanneer hetzelfde functionele type op meerdere plaatsen in de code voorkomt: de alias dient als enig definitiepunt en documenteert het doel van het type.
Typealias creëert geen nieuw type — het is slechts een synoniem. Variabelen van het type Callback en (Result) -> Unit zijn volledig uitwisselbaar. De compiler geeft geen fout als een lambda direct wordt doorgegeven aan een functie die Callback verwacht. Dit onderscheidt typealias van inline class (value class), die een nieuw wrapper-type creëert met controle tijdens compilatie. Typealias is een hernoeming, geen wrapper.
Het meest voorkomende gebruiksscenario voor typealias in Kotlin zijn functionele types. Lange handtekeningen zoals (Int, String) -> Boolean of (List
// Zonder typealias
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// Met typealias
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// Gebruik in klasse
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
In het voorbeeld verbergt typealias UserFilter het complexe functionele type (List
Typealias ondersteunt generieke parameters, wat het nog flexibeler maakt. Men kan typealias Mapper
// Generieke typealias
typealias Mapper<T, R> = (T) -> R
typealias Provider<T> = () -> T
typealias ListTransformer<T> = (List<T>) -> List<T>
fun processNumbers(mapper: Mapper<Int, String>) {
// mapper-type is (Int) -> String
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
In de listing is Mapper
Geneste klassen en lange geparametriseerde types — een ander gebied waar typealias de code aanzienlijk vereenvoudigt. Als een klasse diep in de nestingshiërarchie zit (Outer.Inner.Nested), vervuilt verwijzing ernaar met de volledige naam de code. Typealias verkort deze toegang en maakt het leesbaarder. Dit is vooral relevant voor klassen uit bibliotheken van derden met lange namen.
// Alias voor geneste klasse
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// Alias voor lang bibliotheektype
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
}
In het voorbeeld is NetworkError — een alias voor de geneste klasse NetworkResponse.Error. Bij import van typealias kan NetworkError worden gebruikt als een gewoon type, zonder de nestingshiërarchie te onthullen. JsonMap documenteert dat de kaart een JSON-object voorstelt. UserId verklaart het doel van Long in de specifieke context — de lezer begrijpt onmiddellijk dat dit een gebruikersidentificatie is, geen willekeurig getal. Typealias beschermt echter niet tegen het doorgeven van een gewone Long waar UserId wordt verwacht — daarvoor is value class nodig.
Typealias en inline class (value class) lossen verschillende taken op, hoewel beide een nieuwe naam voor een type introduceren. Typealias is slechts een synoniem: een variabele van het type UserId = Long accepteert elke Long zonder controle. Inline class wikkelt de waarde in een nieuw type dat tijdens compilatie wordt gecontroleerd: het doorgeven van een gewone Long waar inline class UserId wordt verwacht, is onmogelijk zonder expliciete conversie.
| Kenmerk | Typealias | Inline class |
|---|---|---|
| Nieuw type | Nee — synoniem van origineel | Ja — nieuw type met controles |
| Prestaties | Nihil — volledig gewist | Nihil — wrapper verwijderd in bytecode |
| Overerving | Nee | Nee (final class) |
| Eigen methoden | Nee | Ja — functies kunnen worden gedeclareerd |
| Typeveiligheid | Nee — uitwisselbaar met origineel | Ja — compiler onderscheidt types |
De tabel toont het verschil tussen de twee mechanismen. Typealias is geschikt voor korte namen en codedocumentatie wanneer strikte typering niet vereist is. Inline class via het sleutelwoord value class (voorheen inline class) is nodig wanneer het belangrijk is om semantisch verschillende waarden van hetzelfde primitieve type te onderscheiden. Bijvoorbeeld, UserId en OrderId zijn beide Long, maar het doorgeven van de ene waar de andere wordt verwacht is een logische fout die value class tijdens compilatie voorkomt.
Veelgestelde vragen
Import alias (import com.example.LongName as Short) werkt op importniveau — verkort de naam alleen in het huidige bestand. Typealias declareert een globale alias die na import in het hele project beschikbaar is.
Ja, typealias ondersteunt recursieve definities voor functionele types, maar met voorzichtigheid: typealias Rec
Nee, typealias wordt volledig gewist tijdens de compilatiefase. In bytecode en runtime wordt het originele type gebruikt zonder enige wrapper. De prestaties zijn identiek aan direct gebruik van het originele type.
Typealias kan naar een andere typealias verwijzen — dit wordt een alias-keten genoemd. De diepte van de keten is formeel niet beperkt, maar voor leesbaarheid wordt niet meer dan 2–3 niveaus aanbevolen. De compiler ontvouwt de keten volledig tijdens de analysefase.
Nee, typealias is een declaratie op het hoogste niveau of een lid van een klasse/object. Binnen functies kan typealias niet worden gedeclareerd. Voor lokale verkorting van types gebruikt u import alias in het bestand of brengt u typealias naar moduleniveau.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook