Typealias — apa itu, sintaksis dan penerapannya di Kotlin

Penulis: IT Sectr Diterbitkan: 2026-06-23 Waktu membaca: 7 mnt

Typealias adalah mekanisme Kotlin untuk membuat nama alternatif dari tipe yang sudah ada. Kata kunci typealias memungkinkan mengganti deklarasi tipe yang kompleks dengan alias yang pendek dan mudah dipahami, tanpa membuat tipe baru. Menurut dokumentasi Kotlin (2026), typealias meningkatkan keterbacaan kode, terutama dalam tanda tangan fungsi dengan tipe fungsional. Typealias membuat kode menjadi self-documenting, menggantikan deklarasi yang bertele-tele dengan tipe bernama yang mudah dipahami.

Poin utama

  • Typealias — alias untuk tipe yang sudah ada, tidak membuat tipe baru
  • Tipe fungsional — typealias menggantikan (T) -> R yang kompleks dengan nama yang mudah dibaca seperti Callback
  • Generik — typealias mendukung parameter generik: typealias ListMapper = (T) -> T
  • Kelas bersarang — typealias mempersingkat akses ke kelas bersarang dari paket lain
  • Keamanan tipe — typealias tidak menambahkan pemeriksaan pada tahap kompilasi, alias sepenuhnya dapat dipertukarkan dengan aslinya

Apa itu typealias?

Typealias (alias tipe) — deklarasi yang memperkenalkan nama alternatif untuk tipe yang sudah ada. Sintaksis: typealias NamaBaru = TipeYangAda. Setelah deklarasi, NamaBaru dapat digunakan di mana pun TipeYangAda diharapkan — kompiler memperlakukannya sebagai tipe yang sama. Di tingkat bytecode, typealias tidak meninggalkan jejak: semua informasi tentang alias dihapus pada tahap kompilasi.

Tujuan utama typealias adalah meningkatkan keterbacaan kode. Alih-alih tanda tangan panjang fun process(callback: (Result) -> Unit) dapat ditulis typealias Callback = (Result) -> Unit dan menggunakan Callback sebagai tipe parameter. Ini sangat berguna ketika tipe fungsional yang sama berulang di beberapa tempat dalam kode: alias berfungsi sebagai titik definisi tunggal dan mendokumentasikan tujuan tipe.

Typealias tidak membuat tipe baru — ini hanya sinonim. Variabel bertipe Callback dan (Result) -> Unit sepenuhnya dapat dipertukarkan. Kompiler tidak akan memberikan kesalahan jika lambda diberikan langsung ke fungsi yang mengharapkan Callback. Ini membedakan typealias dari inline class (value class), yang membuat tipe pembungkus baru dengan pemeriksaan pada tahap kompilasi. Typealias adalah penggantian nama, bukan pembungkus.

Typealias untuk tipe fungsional

Skenario penggunaan typealias yang paling umum di Kotlin adalah tipe fungsional. Tanda tangan panjang seperti (Int, String) -> Boolean atau (List) -> Result membuat kode sulit dibaca. Typealias mengubahnya menjadi nama pendek yang bermakna yang mendokumentasikan tujuan fungsi: typealias Validator = (String) -> Boolean menentukan bahwa ini adalah validator string.

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

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

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

// Penggunaan di kelas
typealias OnClickListener = (View) -> Unit

class Button {
    var onClick: OnClickListener = {}
}

Dalam contoh, typealias UserFilter menyembunyikan tipe fungsional kompleks (List) -> List di balik nama pendek. Tanda tangan findUsers menjadi terbaca: «menerima UserFilter, mengembalikan List». Typealias OnClickListener membuat kode mirip dengan deklarasi antarmuka, tetapi tanpa overhead pembuatan antarmuka atau kelas abstrak terpisah. Lambda dan fungsi anonim tetap berfungsi seperti biasa — typealias tidak memerlukan perubahan pada kode pemanggil.

Typealias dengan generik

Typealias mendukung parameter generik, membuatnya lebih fleksibel. Dapat didefinisikan typealias Mapper = (T) -> R dan digunakan dengan tipe apa pun. Kompiler mengganti tipe konkret di tempat parameter pada setiap penggunaan alias, mempertahankan keamanan tipe penuh.

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

fun processNumbers(mapper: Mapper<Int, String>) {
    // tipe mapper adalah (Int) -> String
}

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

Dalam listing, Mapper — alias generik untuk transformasi apa pun dari T ke R. Provider — penyedia nilai (pabrik tanpa argumen). ListTransformer — fungsi transformasi daftar. Pada pemanggilan processNumbers(mapper: Mapper) kompiler membuka alias menjadi (Int) -> String. Generik membuat typealias menjadi alat universal yang cocok untuk konteks apa pun tanpa duplikasi deklarasi.

Typealias untuk kelas bersarang dan nama panjang

Kelas bersarang dan tipe terparameterisasi panjang — area lain di mana typealias secara signifikan menyederhanakan kode. Jika sebuah kelas berada jauh di dalam hierarki bersarang (Outer.Inner.Nested), merujuknya dengan nama lengkap mengacaukan kode. Typealias mempersingkat akses tersebut dan membuatnya lebih terbaca. Ini sangat relevan untuk kelas dari pustaka pihak ketiga dengan nama panjang.

kotlin
// Alias untuk kelas bersarang
class NetworkResponse {
    class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error

// Alias untuk tipe pustaka panjang
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
}

Dalam contoh, NetworkError — alias untuk kelas bersarang NetworkResponse.Error. Saat mengimpor typealias, NetworkError dapat digunakan sebagai tipe biasa, tanpa mengungkap hierarki bersarang. JsonMap mendokumentasikan bahwa peta tersebut mewakili objek JSON. UserId menjelaskan tujuan Long dalam konteks tertentu — pembaca langsung memahami bahwa ini adalah pengidentifikasi pengguna, bukan angka sembarang. Namun typealias tidak melindungi dari pengiriman Long biasa ke tempat yang diharapkan UserId — untuk itu diperlukan value class.

Typealias vs inline class: perbedaan

Typealias dan inline class (value class) menyelesaikan tugas yang berbeda, meskipun keduanya memperkenalkan nama baru untuk tipe. Typealias hanyalah sinonim: variabel bertipe UserId = Long menerima Long apa pun tanpa pemeriksaan. Inline class membungkus nilai ke dalam tipe baru yang diperiksa pada tahap kompilasi: mengirim Long biasa ke tempat yang diharapkan inline class UserId tidak mungkin tanpa konversi eksplisit.

KarakteristikTypealiasInline class
Tipe baruTidak — sinonim asliYa — tipe baru dengan pemeriksaan
KinerjaNol — dihapus sepenuhnyaNol — pembungkus dihilangkan di bytecode
PewarisanTidakTidak (final class)
Metode sendiriTidakYa — fungsi dapat dideklarasikan
Keamanan tipeTidak — dapat dipertukarkan dengan asliYa — kompiler membedakan tipe

Tabel menunjukkan perbedaan antara kedua mekanisme. Typealias cocok untuk nama pendek dan dokumentasi kode ketika pengetikan ketat tidak diperlukan. Inline class melalui kata kunci value class (sebelumnya inline class) diperlukan ketika penting untuk membedakan nilai yang berbeda secara semantik dari tipe primitif yang sama. Misalnya, UserId dan OrderId keduanya Long, tetapi mengirim salah satu ke tempat yang diharapkan yang lain adalah kesalahan logis yang dicegah oleh value class pada tahap kompilasi.

Pertanyaan yang sering diajukan

Apa perbedaan typealias dengan import alias?

Import alias (import com.example.LongName as Short) bekerja pada tingkat impor — mempersingkat nama hanya di file saat ini. Typealias mendeklarasikan alias global yang tersedia di seluruh proyek setelah impor.

Bisakah typealias digunakan untuk membuat tipe rekursif?

Ya, typealias mendukung definisi rekursif untuk tipe fungsional, tetapi dengan hati-hati: typealias Rec = (T) -> Rec berfungsi, tetapi referensi rekursif ke object — tidak. Kompiler memeriksa siklus dan memberikan kesalahan untuk definisi tak terbatas.

Apakah typealias memengaruhi kinerja?

Tidak, typealias sepenuhnya dihapus pada tahap kompilasi. Di bytecode dan runtime, tipe asli digunakan tanpa pembungkus apa pun. Kinerja identik dengan penggunaan langsung tipe asli.

Berapa tingkat bersarang maksimum untuk typealias?

Typealias dapat merujuk ke typealias lain — ini disebut rantai alias. Kedalaman rantai secara formal tidak terbatas, tetapi untuk keterbacaan disarankan tidak lebih dari 2–3 tingkat. Kompiler membuka rantai sepenuhnya pada tahap analisis.

Bisakah typealias dideklarasikan di dalam fungsi?

Tidak, typealias adalah deklarasi tingkat atas atau anggota kelas/objek. Di dalam fungsi, typealias tidak dapat dideklarasikan. Untuk pemendekan lokal tipe, gunakan import alias di dalam file atau bawa typealias ke tingkat modul.

Ringkasan

  • Typealias — sinonim untuk tipe yang sudah ada, tidak membuat tipe baru dan dihapus pada tahap kompilasi
  • Tipe fungsional — area penerapan utama: typealias menggantikan (T) -> R dengan nama terbaca seperti Callback
  • Generik dalam typealias memungkinkan pembuatan alias generik Mapper untuk tipe apa pun
  • Kelas bersarang — typealias mempersingkat akses ke tipe yang bersarang dalam dan nama panjang dari pustaka
  • Keamanan tipe tidak ada: typealias sepenuhnya dapat dipertukarkan dengan tipe asli
  • Value class — alternatif untuk typealias ketika pemeriksaan tipe ketat dengan biaya nol saat runtime diperlukan
  • Keterbacaan — keuntungan utama: nama tipe yang bermakna membuat kode mendokumentasikan diri sendiri tanpa overhead

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga