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 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.
Skenario penggunaan typealias yang paling umum di Kotlin adalah tipe fungsional. Tanda tangan panjang seperti (Int, String) -> Boolean atau (List
// 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
Typealias mendukung parameter generik, membuatnya lebih fleksibel. Dapat didefinisikan typealias Mapper
// 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
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.
// 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 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.
| Karakteristik | Typealias | Inline class |
|---|---|---|
| Tipe baru | Tidak — sinonim asli | Ya — tipe baru dengan pemeriksaan |
| Kinerja | Nol — dihapus sepenuhnya | Nol — pembungkus dihilangkan di bytecode |
| Pewarisan | Tidak | Tidak (final class) |
| Metode sendiri | Tidak | Ya — fungsi dapat dideklarasikan |
| Keamanan tipe | Tidak — dapat dipertukarkan dengan asli | Ya — 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
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.
Ya, typealias mendukung definisi rekursif untuk tipe fungsional, tetapi dengan hati-hati: typealias Rec
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.
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.
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
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.
Baca juga