Typealias — bu nima, sintaksisi va Kotlin'da qo'llanilishi

Muallif: IT Sectr Nashr etilgan: 2026-06-23 O'qish vaqti: 7 daq

Typealias — mavjud tur uchun muqobil nom yaratish mexanizmi bo'lgan Kotlin xususiyatidir. Typealias kalit so'zi murakkab tur deklaratsiyasini qisqa va tushunarli taxallus bilan almashtirishga imkon beradi, yangi tur yaratmasdan. Kotlin hujjatlariga (2026) ko'ra, typealias kod o'qilishini yaxshilaydi, ayniqsa funksional turdagi funksiya imzolarida. Typealias kodni o'zini o'zi hujjatlashtiradigan qiladi, ko'p so'zli deklaratsiyalarni tushunarli nomlangan turlar bilan almashtirib.

Asosiy fikrlar

  • Typealias — mavjud tur uchun taxallus, yangi tur yaratmaydi
  • Funksional turlar — typealias murakkab (T) -> R ni Callback kabi o'qiladigan nomlar bilan almashtiradi
  • Generiklar — typealias umumlashtirilgan parametrlarni qo'llab-quvvatlaydi: typealias ListMapper = (T) -> T
  • Ichma-ich sinflar — typealias boshqa paketlardan ichma-ich sinflarga kirishni qisqartiradi
  • Tur xavfsizligi — typealias kompilyatsiya bosqichida tekshiruvlar qo'shmaydi, taxallus original bilan to'liq almashinuvchan

Typealias nima?

Typealias (tur taxallusi) — mavjud tur uchun muqobil nom kiritadigan deklaratsiyadir. Sintaksis: typealias YangiNom = MavjudTur. Deklaratsiyadan so'ng YangiNom MavjudTur kutilgan har qanday joyda ishlatilishi mumkin — kompilyator ularni bir xil tur sifatida qabul qiladi. Bayt-kod darajasida typealias hech qanday iz qoldirmaydi: taxallus haqidagi barcha ma'lumotlar kompilyatsiya bosqichida o'chiriladi.

Typealias-ning asosiy maqsadi kod o'qilishini yaxshilashdir. Uzun imza fun process(callback: (Result) -> Unit) o'rniga typealias Callback = (Result) -> Unit yozish va Callback-ni parametr turi sifatida ishlatish mumkin. Bu, ayniqsa, bir xil funksional tur kodning bir necha joyida takrorlanganda foydalidir: taxallus yagona aniqlash nuqtasi bo'lib xizmat qiladi va turning maqsadini hujjatlashtiradi.

Typealias yangi tur yaratmaydi — bu shunchaki sinonim. Callback turi va (Result) -> Unit o'zgaruvchilari to'liq almashinuvchan. Kompilyator Callback kutayotgan funksiyaga to'g'ridan-to'g'ri lambda uzatilsa, xato bermaydi. Bu typealias-ni inline class (value class) dan farqlaydi — inline class kompilyatsiya bosqichida tekshirish bilan yangi tur-o'ram yaratadi. Typealias — nomlash, o'ram emas.

Funksional turlar uchun typealias

Kotlin'da typealias-ning eng keng tarqalgan stsenariysi funksional turlardir. (Int, String) -> Boolean yoki (List) -> Result kabi uzun imzolar kodni o'qishni qiyinlashtiradi. Typealias ularni funksiyaning maqsadini hujjatlashtiradigan qisqa mazmunli nomlarga aylantiradi: typealias Validator = (String) -> Boolean bu satr validator ekanligini bildiradi.

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

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

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

// Sinfda ishlatish
typealias OnClickListener = (View) -> Unit

class Button {
    var onClick: OnClickListener = {}
}

Misolda, typealias UserFilter murakkab funksional turni (List) -> List qisqa nom orqasida yashiradi. findUsers imzosi o'qiladigan bo'ladi: «UserFilter qabul qiladi, List qaytaradi». Typealias OnClickListener kodni interfeys deklaratsiyasiga o'xshatadi, lekin alohida interfeys yoki abstrakt sinf yaratish yuklamasisiz. Lambdalar va anonim funksiyalar odatdagidek ishlaydi — typealias chaqiruvchi kodda o'zgartirish talab qilmaydi.

Generiklar bilan typealias

Typealias umumlashtirilgan parametrlarni (generiklarni) qo'llab-quvvatlaydi, bu uni yanada moslashuvchan qiladi. typealias Mapper = (T) -> R aniqlash va istalgan turlar bilan ishlatish mumkin. Kompilyator taxallusning har bir ishlatilishida parametrlar o'rniga aniq turlarni qo'yadi, to'liq tur xavfsizligini saqlab.

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 turi (Int) -> String
}

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

Listingda Mapper — T dan R ga istalgan o'zgartirish uchun umumlashtirilgan taxallus. Provider — qiymat yetkazib beruvchi (argumentsiz fabrika). ListTransformer — ro'yxatni o'zgartiruvchi funksiya. processNumbers(mapper: Mapper) chaqiruvida kompilyator taxallusni (Int) -> String ga ochadi. Generiklar typealias-ni deklaratsiyalarni takrorlamasdan har qanday kontekstga mos universal vositaga aylantiradi.

Ichma-ich sinflar va uzun nomlar uchun typealias

Ichma-ich sinflar va uzun parametrlashgan turlar — typealias kodni sezilarli darajada soddalashtiradigan yana bir sohadir. Agar sinf joylashish iyerarxiyasida chuqur bo'lsa (Outer.Inner.Nested), unga to'liq nom bilan murojaat qilish kodni chalkashtiradi. Typealias bunday kirishni qisqartiradi va uni o'qiladigan qiladi. Bu, ayniqsa, uzoq nomli tashqi kutubxonalar sinflari uchun muhimdir.

kotlin
// Ichma-ich sinf uchun taxallus
class NetworkResponse {
    class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error

// Uzun kutubxona turi uchun taxallus
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
}

Misolda NetworkError — NetworkResponse.Error ichma-ich sinfi uchun taxallus. Typealias-ni import qilganda NetworkError-dan oddiy tur sifatida foydalanish mumkin, joylashish iyerarxiyasini ochiqlamasdan. JsonMap xaritaning JSON obyektini ifodalashini hujjatlashtiradi. UserId konkret kontekstda Long ning maqsadini tushuntiradi — o'quvchi darhol bu foydalanuvchi identifikatori ekanligini, ixtiyoriy raqam emasligini tushunadi. Biroq typealias oddiy Long ni UserId kutilgan joyga uzatilishidan himoya qilmaydi — buning uchun value class kerak.

Typealias vs inline class: farqlar

Typealias va inline class (value class) turli vazifalarni hal qiladi, ikkalasi ham tur uchun yangi nom kiritsa-da. Typealias shunchaki sinonim: UserId = Long turidagi o'zgaruvchi hech qanday tekshiruvsiz istalgan Long ni qabul qiladi. Inline class qiymatni kompilyatsiya bosqichida tekshiriladigan yangi turga o'raydi: inline class UserId kutilgan joyga oddiy Long ni uzatish aniq konversiyasiz mumkin emas.

XususiyatTypealiasInline class
Yangi turYo'q — originalning sinonimiHa — tekshiruvlari bo'lgan yangi tur
UnumdorlikNol — butunlay o'chiriladiNol — o'ram bayt-kodda olib tashlanadi
MerosYo'qYo'q (final class)
O'z metodlariYo'qHa — funksiyalar e'lon qilinishi mumkin
Tur xavfsizligiYo'q — original bilan almashinuvchanHa — kompilyator turlarni farqlaydi

Jadval ikki mexanizm o'rtasidagi farqni ko'rsatadi. Typealias qisqa nomlar va kod hujjatlari uchun mos, qattiq tipizatsiya talab qilinmaganda. Inline class value class kalit so'zi orqali (avval inline class) bir xil primitiv turning semantik jihatdan farqli qiymatlarini ajratish muhim bo'lganda kerak. Masalan, UserId va OrderId ikkalasi ham Long, lekin birining ikkinchisi kutilgan joyga uzatilishi mantiqiy xatodir, value class buni kompilyatsiya bosqichida oldini oladi.

Tez-tez so'raladigan savollar

Typealias import alias-dan nima bilan farqlanadi?

Import alias (import com.example.LongName as Short) import darajasida ishlaydi — nomni faqat joriy faylda qisqartiradi. Typealias importdan so'ng butun loyihada mavjud bo'lgan global taxallus e'lon qiladi.

Rekursiv tur yaratish uchun typealias ishlatish mumkinmi?

Ha, typealias funksional turlar uchun rekursiv ta'riflarni qo'llab-quvvatlaydi, lekin ehtiyot bilan: typealias Rec = (T) -> Rec ishlaydi, lekin object ga rekursiv havolalar — yo'q. Kompilyator siklarni tekshiradi va cheksiz ta'riflar uchun xato beradi.

Typealias unumdorlikka ta'sir qiladimi?

Yo'q, typealias kompilyatsiya bosqichida butunlay o'chiriladi. Bayt-kodda va runtime-da hech qanday o'ramsiz original tur ishlatiladi. Unumdorlik original turning to'g'ridan-to'g'ri ishlatilishi bilan bir xil.

Typealias uchun maksimal joylashish darajasi qancha?

Typealias boshqa typealias-ga murojaat qilishi mumkin — bu taxalluslar zanjiri deb ataladi. Zanjir chuqurligi rasmiy ravishda cheklanmagan, lekin o'qilishi uchun 2–3 darajadan oshmasligi tavsiya etiladi. Kompilyator zanjirni tahlil bosqichida to'liq ochadi.

Funksiya ichida typealias e'lon qilish mumkinmi?

Yo'q, typealias yuqori darajadagi deklaratsiya yoki sinf/obyekt a'zosidir. Funksiyalar ichida typealias e'lon qilish mumkin emas. Turlarni mahalliy qisqartirish uchun fayl ichida import alias-dan foydalaning yoki typealias-ni modul darajasiga chiqaring.

Xulosa

  • Typealias — mavjud tur uchun sinonim, yangi tur yaratmaydi va kompilyatsiya bosqichida o'chiriladi
  • Funksional turlar — asosiy qo'llanish sohasi: typealias (T) -> R ni Callback kabi o'qiladigan nom bilan almashtiradi
  • Generiklar typealias-da istalgan turlar uchun umumlashtirilgan Mapper taxalluslari yaratishga imkon beradi
  • Ichma-ich sinflar — typealias chuqur joylashgan turlarga va kutubxonalardan uzun nomlarga kirishni qisqartiradi
  • Tur xavfsizligi yo'q: typealias original tur bilan to'liq almashinuvchan
  • Value class — runtime-da nol xarajat bilan qattiq tur tekshiruvi kerak bo'lganda typealias-ga alternativ
  • O'qilishi — asosiy afzallik: mazmunli tur nomlari kodni yuklamasdan o'zini o'zi hujjatlashtiradigan qiladi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing