Typealias är en Kotlin-mekanism för att skapa ett alternativt namn för en befintlig typ. Nyckelordet typealias gör det möjligt att ersätta en komplex typdeklaration med ett kort och begripligt alias, utan att skapa en ny typ. Enligt Kotlin-dokumentationen (2026) förbättrar typealias kodläsbarheten, särskilt i funktionssignaturer med funktionella typer. Typealias gör koden självdokumenterande genom att ersätta mångordiga deklarationer med begripliga namngivna typer.
Huvudpunkter
Typealias (typalias) — en deklaration som introducerar ett alternativt namn för en befintlig typ. Syntax: typealias NyttNamn = BefintligTyp. Efter deklarationen kan NyttNamn användas överallt där BefintligTyp förväntas — kompilatorn behandlar dem som samma typ. På bytekodnivå lämnar typealias inga spår: all information om aliaset raderas i kompileringsfasen.
Huvudmålet med typealias är att förbättra kodläsbarheten. Istället för en lång signatur fun process(callback: (Result) -> Unit) kan man skriva typealias Callback = (Result) -> Unit och använda Callback som parametertyp. Detta är särskilt användbart när samma funktionella typ upprepas på flera ställen i koden: aliaset fungerar som en enda definitionspunkt och dokumenterar typens syfte.
Typealias skapar inte en ny typ — det är bara en synonym. Variabler av typen Callback och (Result) -> Unit är helt utbytbara. Kompilatorn ger inget fel om en lambda skickas direkt till en funktion som förväntar Callback. Detta skiljer typealias från inline class (value class), som skapar en ny omslagstyp med kontroll vid kompilering. Typealias är en omdöpning, inte en omslagning.
Det vanligaste användningsscenariot för typealias i Kotlin är funktionella typer. Långa signaturer som (Int, String) -> Boolean eller (List
// Utan typealias
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// Med typealias
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// Användning i klass
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
I exemplet döljer typealias UserFilter den komplexa funktionella typen (List
Typealias stöder generiska parametrar, vilket gör det ännu mer flexibelt. Man kan definiera typealias Mapper
// Generiskt 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-typ är (Int) -> String
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
I listningen är Mapper
Nästlade klasser och långa parameteriserade typer — ett annat område där typealias avsevärt förenklar koden. Om en klass ligger djupt i nästlingshierarkin (Outer.Inner.Nested), skräpar referens till den med fullständigt namn ner koden. Typealias förkortar denna åtkomst och gör den mer läsbar. Detta är särskilt viktigt för klasser från tredjepartsbibliotek med långa namn.
// Alias för nästlad klass
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// Alias för lång bibliotekstyp
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
}
I exemplet är NetworkError — ett alias för den nästlade klassen NetworkResponse.Error. Vid import av typealias kan NetworkError användas som en vanlig typ, utan att avslöja nästlingshierarkin. JsonMap dokumenterar att kartan representerar ett JSON-objekt. UserId förklarar syftet med Long i det specifika sammanhanget — läsaren förstår omedelbart att detta är en användaridentifierare, inte ett godtyckligt tal. Typealias skyddar dock inte mot att skicka en vanlig Long dit UserId förväntas — för det krävs value class.
Typealias och inline class (value class) löser olika uppgifter, även om båda introducerar ett nytt namn för en typ. Typealias är bara en synonym: en variabel av typen UserId = Long accepterar vilken Long som helst utan kontroll. Inline class omsluter värdet i en ny typ som kontrolleras vid kompilering: att skicka en vanlig Long dit inline class UserId förväntas är omöjligt utan explicit konvertering.
| Egenskap | Typealias | Inline class |
|---|---|---|
| Ny typ | Nej — synonym till originalet | Ja — ny typ med kontroller |
| Prestanda | Ingen — raderas helt | Ingen — omslag tas bort i bytekod |
| Arv | Nej | Nej (final class) |
| Egna metoder | Nej | Ja — funktioner kan deklareras |
| Typsäkerhet | Nej — utbytbart med originalet | Ja — kompilatorn särskiljer typer |
Tabellen visar skillnaden mellan de två mekanismerna. Typealias är lämpligt för korta namn och kod dokumentation när strikt typning inte krävs. Inline class via nyckelordet value class (tidigare inline class) behövs när det är viktigt att särskilja semantiskt olika värden av samma primitiva typ. Till exempel, UserId och OrderId är båda Long, men att skicka den ena dit den andra förväntas är ett logiskt fel som value class förhindrar vid kompilering.
Vanliga frågor
Import alias (import com.example.LongName as Short) fungerar på importnivå — förkortar namnet endast i den aktuella filen. Typealias deklarerar ett globalt alias som är tillgängligt i hela projektet efter import.
Ja, typealias stöder rekursiva definitioner för funktionella typer, men med försiktighet: typealias Rec
Nej, typealias raderas helt i kompileringsfasen. I bytekod och runtime används den ursprungliga typen utan något omslag. Prestandan är identisk med direkt användning av den ursprungliga typen.
Typealias kan referera till ett annat typealias — detta kallas en alias-kedja. Kedjans djup är formellt inte begränsat, men för läsbarhet rekommenderas högst 2–3 nivåer. Kompilatorn vecklar ut kedjan helt i analysfasen.
Nej, typealias är en deklaration på högsta nivå eller medlem av en klass/objekt. Inuti funktioner kan typealias inte deklareras. För lokal förkortning av typer, använd import alias i filen eller flytta typealias till modulnivå.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också