Typealias — bu nədir, sintaksisi və Kotlin-də tətbiqi

Müəllif: IT Sectr Dərc olunub: 2026-06-23 Oxuma vaxtı: 7 dəq

Typealias — mövcud tip üçün alternativ ad yaratmaq mexanizmi olan Kotlin xüsusiyyətidir. Typealias açar sözü mürəkkəb tip bəyannaməsini qısa və başa düşülən bir aliasla əvəz etməyə imkan verir, yeni tip yaratmadan. Kotlin sənədlərinə (2026) görə, typealias kodun oxunaqlılığını artırır, xüsusən funksional tipli funksiya imzalarında. Typealias kodu özünü sənədləşdirən edir, çoxsözlü bəyannamələri başa düşülən adlandırılmış tiplərlə əvəz edərək.

Əsas məqamlar

  • Typealias — mövcud tip üçün alias, yeni tip yaratmır
  • Funksional tiplər — typealias mürəkkəb (T) -> R tiplərini Callback kimi oxunaqlı adlarla əvəz edir
  • Generiklər — typealias ümumiləşdirilmiş parametrləri dəstəkləyir: typealias ListMapper = (T) -> T
  • İç-içə siniflər — typealias digər paketlərdən iç-içə siniflərə girişi qısaldır
  • Tip təhlükəsizliyi — typealias kompilasiya mərhələsində yoxlamalar əlavə etmir, alias orijinalla tam qarşılıqlı əvəz olunandır

Typealias nədir?

Typealias (tip aliası) — mövcud tip üçün alternativ ad təqdim edən bəyannamədir. Sintaksis: typealias YeniAd = MövcudTip. Bəyannamədən sonra YeniAd, MövcudTip-in gözlənildiyi hər yerdə istifadə edilə bilər — kompilator onları eyni tip kimi qəbul edir. Bayt-kod səviyyəsində typealias heç bir iz buraxmır: alias haqqında bütün məlumatlar kompilasiya mərhələsində silinir.

Typealias-ın əsas məqsədi kodun oxunaqlılığını yaxşılaşdırmaqdır. Uzun imza fun process(callback: (Result) -> Unit) əvəzinə typealias Callback = (Result) -> Unit yazmaq və Callback-i parametr tipi kimi istifadə etmək olar. Bu, eyni funksional tip kodun bir neçə yerində təkrarlandıqda xüsusilə faydalıdır: alias vahid təyin nöqtəsi kimi xidmət edir və tipin məqsədini sənədləşdirir.

Typealias yeni tip yaratmır — bu sadəcə sinonimdir. Callback tipi və (Result) -> Unit dəyişənləri tam qarşılıqlı əvəz olunandır. Kompilator Callback gözləyən funksiyaya birbaşa lambda ötürüldükdə səhv vermir. Bu, typealias-ı inline class-dan (value class) fərqləndirir — inline class kompilasiya mərhələsində yoxlama ilə yeni tip-sarğı yaradır. Typealias adlandırmadır, sarğı deyil.

Funksional tiplər üçün typealias

Kotlin-də typealias-ın ən çox yayılmış istifadə ssenarisi funksional tiplərdir. (Int, String) -> Boolean və ya (List) -> Result kimi uzun imzalar kodu oxumağı çətinləşdirir. Typealias onları funksiyanın məqsədini sənədləşdirən qısa mənalı adlara çevirir: typealias Validator = (String) -> Boolean bunun sətir validatoru olduğunu bildirir.

kotlin
// Typealias olmadan
fun findUsers(
    filter: (List<User>) -> List<User>
): List<User>

// Typealias ilə
typealias UserFilter = (List<User>) -> List<User>

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

// Sinifdə istifadə
typealias OnClickListener = (View) -> Unit

class Button {
    var onClick: OnClickListener = {}
}

Nümunədə typealias UserFilter mürəkkəb funksional tipi (List) -> List qısa ad arxasında gizlədir. findUsers imzası oxunaqlı olur: «UserFilter qəbul edir, List qaytarır». Typealias OnClickListener kodu interfeys bəyannaməsinə bənzədir, lakin ayrıca interfeys və ya abstrakt sinif yaratmaq yükü olmadan. Lambdalar və anonim funksiyalar həmişəki kimi işləyir — typealias çağıran koddan dəyişiklik tələb etmir.

Generiklərlə typealias

Typealias ümumiləşdirilmiş parametrləri (generikləri) dəstəkləyir, bu da onu daha çevik edir. typealias Mapper = (T) -> R təyin etmək və istənilən tiplərlə istifadə etmək olar. Kompilator aliasın hər istifadəsində parametrlərin yerinə konkret tipləri qoyur, tam tip təhlükəsizliyini qoruyaraq.

kotlin
// Generik 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 tipi (Int) -> String
}

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

Listinqdə Mapper — T-dən R-ə istənilən çevrilmə üçün ümumiləşdirilmiş aliasdır. Provider — dəyər təmin edəni (arqumentsiz fabrik). ListTransformer — siyahını çevirən funksiya. processNumbers(mapper: Mapper) çağırışında kompilator aliası (Int) -> String-ə açır. Generiklər typealias-ı hər hansı kontekstə uyğun universal alətə çevirir, bəyannamələrin təkrarlanması olmadan.

İç-içə siniflər və uzun adlar üçün typealias

İç-içə siniflər və uzun parametrləşdirilmiş tiplər — typealias-ın kodu əhəmiyyətli dərəcədə sadələşdirdiyi başqa bir sahədir. Əgər sinif daxilolma iyerarxiyasında dərindirsə (Outer.Inner.Nested), ona tam adla müraciət etmək kodu qarışdırır. Typealias bu girişi qısaldır və daha oxunaqlı edir. Bu, xüsusilə uzun adları olan xarici kitabxanaların sinifləri üçün aktualdır.

kotlin
// İç-içə sinif üçün alias
class NetworkResponse {
    class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error

// Uzun kitabxana tipi üçün alias
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
}

Nümunədə NetworkError — NetworkResponse.Error iç-içə sinfi üçün aliasdır. Typealias-ı import edərkən NetworkError-dan adi tip kimi istifadə etmək olar, daxilolma iyerarxiyasını açıqlamadan. JsonMap xəritənin JSON obyektini təmsil etdiyini sənədləşdirir. UserId konkret kontekstdə Long-un məqsədini izah edir — oxucu dərhal bunun istifadəçi identifikatoru olduğunu, ixtiyari rəqəm olmadığını başa düşür. Lakin typealias adi Long-un UserId gözlənilən yerə ötürülməsindən qorumur — bunun üçün value class lazımdır.

Typealias vs inline class: fərqlər

Typealiasinline class (value class) müxtəlif vəzifələri həll edir, hər ikisi tip üçün yeni ad təqdim etsə də. Typealias sadəcə sinonimdir: UserId = Long tipli dəyişən heç bir yoxlama olmadan istənilən Long qəbul edir. Inline class dəyəri kompilasiya mərhələsində yoxlanılan yeni tipə sarır: inline class UserId gözlənilən yerə adi Long ötürmək açıq çevrilmə olmadan mümkün deyil.

XüsusiyyətTypealiasInline class
Yeni tipXeyr — orijinalın sinonimiBəli — yoxlamaları olan yeni tip
PerformansSıfır — tamamilə silinirSıfır — sarğı bayt-kodda silinir
MirasXeyrXeyr (final class)
Öz metodlarXeyrBəli — funksiyalar təyin oluna bilər
Tip təhlükəsizliyiXeyr — orijinalla əvəz olunandırBəli — kompilator tipləri fərqləndirir

Cədvəl iki mexanizm arasındakı fərqi göstərir. Typealias qısa adlar və kod sənədləşdirməsi üçün uyğundur, ciddi tipizasiya tələb olunmadıqda. Inline class value class açar sözü vasitəsilə (əvvəllər inline class) eyni primitiv tipin semantik fərqli dəyərlərini ayırd etmək vacib olduqda lazımdır. Məsələn, UserId və OrderId hər ikisi Long-dur, lakin birinin digərinin gözlənildiyi yerə ötürülməsi məntiqi səhvdir, value class bunun qarşısını kompilasiya mərhələsində alır.

Tez-tez verilən suallar

Typealias import alias-dan nə ilə fərqlənir?

Import alias (import com.example.LongName as Short) import səviyyəsində işləyir — adı yalnız cari faylda qısaldır. Typealias bütün layihədə importdan sonra əlçatan olan qlobal alias elan edir.

Rekursiv tip yaratmaq üçün typealias istifadə etmək olar?

Bəli, typealias funksional tiplər üçün rekursiv təyinatları dəstəkləyir, lakin ehtiyatla: typealias Rec = (T) -> Rec işləyir, lakin object-ə rekursiv istinadlar — yox. Kompilator dövrləri yoxlayır və sonsuz təyinatlar üçün səhv verir.

Typealias performansa təsir edirmi?

Xeyr, typealias kompilasiya mərhələsində tamamilə silinir. Bayt-kodda və runtime-da heç bir sarğı olmadan orijinal tip istifadə olunur. Performans orijinal tipin birbaşa istifadəsi ilə eynidir.

Typealias üçün maksimum daxilolma səviyyəsi nədir?

Typealias başqa bir typealias-a istinad edə bilər — bu aliaslar zənciri adlanır. Zəncirin dərinliyi formal olaraq məhdud deyil, lakin oxunaqlılıq üçün 2–3 səviyyədən çox olmaması tövsiyə olunur. Kompilator zənciri analiz mərhələsində tamamilə açır.

Funksiya daxilində typealias elan etmək olar?

Xeyr, typealias yuxarı səviyyəli bəyannamə və ya sinif/obyekt üzvüdür. Funksiyalar daxilində typealias elan etmək mümkün deyil. Tipləri lokal qısaltmaq üçün fayl daxilində import alias-dan istifadə edin və ya typealias-ı modul səviyyəsinə çıxarın.

Nəticə

  • Typealias — mövcud tip üçün sinonim, yeni tip yaratmır və kompilasiya mərhələsində silinir
  • Funksional tiplər — əsas tətbiq sahəsi: typealias (T) -> R-i Callback kimi oxunaqlı adla əvəz edir
  • Generiklər typealias-da istənilən tiplər üçün ümumiləşdirilmiş Mapper aliasları yaratmağa imkan verir
  • İç-içə siniflər — typealias dərindən daxil olan tiplərə və kitabxanalardan uzun adlara girişi qısaldır
  • Tip təhlükəsizliyi yoxdur: typealias orijinal tiplə tam qarşılıqlı əvəz olunandır
  • Value class — runtime-da sıfır xərclə ciddi tip yoxlaması lazım olduqda typealias-a alternativdir
  • Oxunaqlılıq — əsas üstünlük: mənalı tip adları kodu yük olmadan özünü sənədləşdirən edir

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun