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 (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.
Kotlin'da typealias-ning eng keng tarqalgan stsenariysi funksional turlardir. (Int, String) -> Boolean yoki (List
// 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
Typealias umumlashtirilgan parametrlarni (generiklarni) qo'llab-quvvatlaydi, bu uni yanada moslashuvchan qiladi. typealias Mapper
// 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
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.
// 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 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.
| Xususiyat | Typealias | Inline class |
|---|---|---|
| Yangi tur | Yo'q — originalning sinonimi | Ha — tekshiruvlari bo'lgan yangi tur |
| Unumdorlik | Nol — butunlay o'chiriladi | Nol — o'ram bayt-kodda olib tashlanadi |
| Meros | Yo'q | Yo'q (final class) |
| O'z metodlari | Yo'q | Ha — funksiyalar e'lon qilinishi mumkin |
| Tur xavfsizligi | Yo'q — original bilan almashinuvchan | Ha — 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
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.
Ha, typealias funksional turlar uchun rekursiv ta'riflarni qo'llab-quvvatlaydi, lekin ehtiyot bilan: typealias Rec
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 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.
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
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.