Typealias — nedir, sözdizimi ve Kotlin’de kullanımı

Yazar: IT Sectr Yayınlanma: 2026-06-23 Okuma süresi: 7 dk

Typealias, mevcut bir tür için alternatif bir ad oluşturmaya yarayan bir Kotlin mekanizmasıdır. typealias anahtar sözcüğü, yeni bir tür oluşturmadan karmaşık bir tür bildirimini kısa ve net bir takma adla değiştirmenize olanak tanır. Kotlin belgelerine (2026) göre, typealias özellikle işlevsel türlere sahip işlev imzalarında kod okunabilirliğini artırır. Typealias, uzun bildirimleri net adlandırılmış türlerle değiştirerek kodu kendi kendini belgeleyen hale getirir.

Önemli Noktalar

  • Typealias — yeni bir tür oluşturmayan, mevcut bir tür için takma ad
  • İşlevsel türler — typealias karmaşık (T) -> R’yi Callback gibi okunabilir adlarla değiştirir
  • Generics — typealias genel parametreleri destekler: typealias ListMapper = (T) -> T
  • İç içe sınıflar — typealias diğer paketlerden iç içe sınıflara erişimi kısaltır
  • Tür güvenliği — typealias derleme zamanı denetimleri eklemez; takma ad orijinaliyle tamamen değiştirilebilir

Typealias nedir?

Typealias (tür takma adı), mevcut bir tür için alternatif bir ad tanıtan bir bildirimdir. Sözdizimi: typealias YeniAd = MevcutTür. Bildirimden sonra, YeniAd, MevcutTür’ün beklendiği her yerde kullanılabilir — derleyici onları aynı tür olarak ele alır. Bayt kodu düzeyinde, typealias hiçbir iz bırakmaz: tüm takma ad bilgileri derleme zamanında silinir.

Typealias’in temel amacı kod okunabilirliğini artırmaktır. Uzun bir imza olan fun process(callback: (Result) -> Unit) yerine, typealias Callback = (Result) -> Unit yazıp Callback’i parametre türü olarak kullanabilirsiniz. Bu, aynı işlevsel tür kodda birden çok yerde tekrarlandığında özellikle kullanışlıdır: takma ad, tek bir tanımlama noktası görevi görür ve türün amacını belgeler.

Typealias yeni bir tür oluşturmaz — sadece bir eşanlamlıdır. Callback ve (Result) -> Unit türündeki değişkenler tamamen değiştirilebilir. Callback bekleyen bir işleve doğrudan bir lambda aktarılırsa derleyici hata vermez. Bu, typealias’i derleme zamanı denetimi olan yeni bir sarmalayıcı tür oluşturan inline class’tan (value class) ayırır. Typealias yeniden adlandırmadır, sarmalama değildir.

İşlevsel türler için Typealias

Kotlin’de typealias’in en yaygın kullanım durumu işlevsel türlerdir. (Int, String) -> Boolean veya (List) -> Result gibi uzun imzalar kodu okumayı zorlaştırır. Typealias bunları, işlevin amacını belgeleyen kısa ve anlamlı adlara dönüştürür: typealias Validator = (String) -> Boolean bunun bir dize doğrulayıcı olduğunu belirtir.

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

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

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

// Usage in class
typealias OnClickListener = (View) -> Unit

class Button {
    var onClick: OnClickListener = {}
}

Örnekte, UserFilter typealias’i karmaşık işlevsel türü (List) -> List kısa bir adın arkasına gizler. findUsers’ın imzası okunabilir hale gelir: “UserFilter kabul eder, List döndürür”. OnClickListener typealias’i, kodu bir arayüz bildirimi gibi gösterir ancak ayrı bir arayüz veya soyut sınıf oluşturma yükü olmadan. Bu arada, lambda ve anonim işlevler normal şekilde çalışmaya devam eder — typealias, çağıran kodda değişiklik gerektirmez.

Generics ile Typealias

Typealias genel parametreleri (generics) destekler, bu da onu daha da esnek hale getirir. typealias Mapper = (T) -> R tanımlayabilir ve herhangi bir türle kullanabilirsiniz. Derleyici, takma adın her kullanımında parametrelerin yerine belirli türleri koyarak tam tür güvenliğini korur.

kotlin
// Generic 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() }
}

Listede, Mapper T’den R’ye herhangi bir dönüşüm için genel bir takma addır. Provider bir değer sağlayıcıdır (bağımsız değişkensiz bir fabrika). ListTransformer bir liste dönüşüm işlevidir. processNumbers(mapper: Mapper) çağrıldığında, derleyici takma adı (Int) -> String’e genişletir. Generics, typealias’i bildirimleri çoğaltmadan her bağlama uygun evrensel bir araç haline getirir.

İç içe ve uzun adlar için Typealias

İç içe sınıflar ve uzun parametrelendirilmiş türler, typealias’in kodu önemli ölçüde basitleştirdiği bir diğer alandır. Bir sınıf, iç içe geçme hiyerarşisinde (Outer.Inner.Nested) derinse, tam adıyla başvurmak kodu karmaşık hale getirir. Typealias bu tür erişimi kısaltır ve daha okunabilir hale getirir. Bu, özellikle uzun adlara sahip üçüncü taraf kütüphanelerdeki sınıflar için geçerlidir.

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

// Alias for long library type
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
}

Örnekte, NetworkError iç içe sınıf NetworkResponse.Error için bir takma addır. Typealias’i içe aktararak, iç içe geçme hiyerarşisini açığa çıkarmadan NetworkError’u normal bir tür olarak kullanabilirsiniz. JsonMap, haritanın bir JSON nesnesini temsil ettiğini belgeler. UserId, Long’un belirli bir bağlamdaki amacını netleştirir — okuyucu bunun rastgele bir sayı değil, bir kullanıcı tanımlayıcısı olduğunu hemen anlar. Ancak typealias, UserId’nin beklendiği yere düz bir Long aktarılmasını engellemez — bunun için bir value class gerekir.

Typealias vs Inline Class: farklar

Typealias ve inline class (value class), her ikisi de bir tür için yeni bir ad tanıtmasına rağmen farklı sorunları çözer. Typealias sadece bir eşanlamlıdır: UserId = Long türündeki bir değişken, denetim olmadan herhangi bir Long’u kabul eder. Inline class, bir değeri derleme zamanında denetlenen yeni bir tür içine sarar: açık dönüştürme olmadan, inline class UserId’nin beklendiği yere düz bir Long aktarılamaz.

ÖzellikTypealiasInline class
Yeni türHayır — orijinalin eşanlamlısıEvet — denetimlerle yeni tür
PerformansSıfır — tamamen silinirSıfır — bayt kodunda sarmalayıcı kaldırılır
KalıtımHayırHayır (son sınıf)
Kendi yöntemleriHayırEvet — işlevler bildirilebilir
Tür güvenliğiHayır — orijinallerle değiştirilebilirEvet — derleyici türleri ayırt eder

Tablo iki mekanizma arasındaki farkı gösterir. Typealias, katı türleme gerekmediğinde kısa adlar ve kod belgeleme için uygundur. value class anahtar sözcüğü (eski adıyla inline class) aracılığıyla Inline class, aynı ilkel türün anlamsal olarak farklı değerlerini ayırt etmenin önemli olduğu durumlarda gereklidir. Örneğin, UserId ve OrderId her ikisi de Long’dur, ancak birinin beklendiği yere diğerini aktarmak, value class’ın derleme zamanında önlediği mantıksal bir hatadır.

Sıkça Sorulan Sorular

Typealias, import alias’tan nasıl farklıdır?

Import alias (import com.example.LongName as Short) içe aktarma düzeyinde çalışır — adı yalnızca geçerli dosyada kısaltır. Typealias, içe aktarmadan sonra proje genelinde kullanılabilen küresel bir takma ad bildirir.

Typealias özyinelemeli bir tür oluşturmak için kullanılabilir mi?

Evet, typealias işlevsel türler için özyinelemeli tanımları destekler, ancak dikkatli olun: typealias Rec = (T) -> Rec çalışır, ancak object’e özyinelemeli başvurular çalışmaz. Derleyici döngüleri kontrol eder ve sonsuz tanımlar için hata verir.

Typealias performansı etkiler mi?

Hayır, typealias derleme zamanında tamamen silinir. Bayt kodu ve çalışma zamanı düzeyinde herhangi bir sarmalayıcı olmadan orijinal tür kullanılır. Performans, orijinal türü doğrudan kullanmakla aynıdır.

Typealias için maksimum iç içe geçme düzeyi nedir?

Typealias başka bir typealias’e başvurabilir — buna takma ad zinciri denir. Zincirin derinliği resmi olarak sınırsızdır, ancak okunabilirlik için 2–3 seviyeden fazlası önerilmez. Derleyici, analiz aşamasında zinciri tamamen çözer.

Typealias bir işlevin içinde bildirilebilir mi?

Hayır, typealias üst düzey bir bildirim veya bir sınıf/nesne üyesidir. Typealias işlevlerin içinde bildirilemez. Yerel tür kısaltması için, dosya içinde import alias kullanın veya typealias’i modül düzeyine yerleştirin.

Özet

  • Typealias — yeni bir tür oluşturmayan ve derleme zamanında silinen, mevcut bir tür için eşanlamlı
  • İşlevsel türler — ana kullanım durumu: typealias (T) -> R’yi Callback gibi okunabilir bir adla değiştirir
  • Generics typealias’te herhangi bir tür için genel takma adlar Mapper oluşturmaya izin verir
  • İç içe sınıflar — typealias derin iç içe türlere ve kütüphanelerdeki uzun adlara erişimi kısaltır
  • Tür güvenliği yoktur: typealias orijinal türle tamamen değiştirilebilir
  • Value class — sıfır çalışma zamanı maliyetiyle katı tür denetimi gerektiğinde typealias’e bir alternatif
  • Okunabilirlik — ana avantaj: anlamlı tür adları, kodun ek yük olmadan kendi kendini belgelemesini sağlar

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun