Typealias مکانیزمی در Kotlin برای ایجاد یک نام جایگزین برای نوع موجود است. کلمه کلیدی typealias به شما امکان میدهد اعلان نوع پیچیده را با یک نام مستعار کوتاه و قابل فهم جایگزین کنید، بدون ایجاد نوع جدید. طبق مستندات Kotlin (2026)، typealias خوانایی کد را بهبود میبخشد، بهویژه در امضای توابع با انواع تابعی. Typealias کد را خودمستند میکند و اعلانهای طولانی را با انواع نامگذاری شده قابل فهم جایگزین مینماید.
نکات اصلی
Typealias (نام مستعار نوع) — اعلانی است که یک نام جایگزین برای نوع موجود معرفی میکند. نحو: typealias نام جدید = نوع موجود. پس از اعلان، نام جدید را میتوان در هر جایی که نوع موجود انتظار میرود استفاده کرد — کامپایلر آنها را یک نوع در نظر میگیرد. در سطح بایتکد، typealias هیچ اثری باقی نمیگذارد: تمام اطلاعات مربوط به نام مستعار در مرحله کامپایل پاک میشود.
هدف اصلی typealias بهبود خوانایی کد است. به جای امضای طولانی fun process(callback: (Result) -> Unit) میتوان typealias Callback = (Result) -> Unit نوشت و از Callback به عنوان نوع پارامتر استفاده کرد. این بهویژه زمانی مفید است که یک نوع تابعی یکسان در چندین مکان از کد تکرار میشود: نام مستعار به عنوان نقطه تعریف واحد عمل میکند و هدف نوع را مستند میسازد.
Typealias نوع جدیدی ایجاد نمیکند — این فقط یک مترادف است. متغیرهای نوع Callback و (Result) -> Unit کاملاً قابل جایگزینی هستند. کامپایلر خطایی نمیدهد اگر به تابعی که Callback را انتظار دارد، یک لامبدا مستقیم ارسال شود. این typealias را از inline class (value class) متمایز میکند که یک نوع بستهبندی جدید با بررسی در مرحله کامپایل ایجاد میکند. Typealias تغییر نام است، نه بستهبندی.
متداولترین سناریوی استفاده از typealias در Kotlin انواع تابعی هستند. امضاهای طولانی مانند (Int, String) -> Boolean یا (List
// بدون typealias
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// با typealias
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// استفاده در کلاس
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
در مثال، typealias UserFilter نوع تابعی پیچیده (List
Typealias از پارامترهای عمومی (جنریکها) پشتیبانی میکند که آن را حتی انعطافپذیرتر میسازد. میتوان typealias Mapper
// 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 (Int) -> String است
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
در لیستینگ Mapper
کلاسهای تو در تو و انواع طولانی پارامتری شده — حوزه دیگری که typealias به طور قابل توجهی کد را ساده میکند. اگر کلاسی عمیقاً در سلسلهمراتب تودرتو قرار دارد (Outer.Inner.Nested)، ارجاع به آن با نام کامل کد را شلوغ میکند. Typealias این دسترسی را کوتاه و خواناتر میکند. این بهویژه برای کلاسهای کتابخانههای شخص ثالث با نامهای طولانی اهمیت دارد.
// نام مستعار برای کلاس تو در تو
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// نام مستعار برای نوع کتابخانه طولانی
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
}
در مثال NetworkError — نام مستعار برای کلاس تو در تو NetworkResponse.Error است. هنگام import typealias میتوان از NetworkError به عنوان یک نوع معمولی استفاده کرد، بدون افشای سلسلهمراتب تودرتو. JsonMap مستند میکند که نقشه یک شی JSON را نشان میدهد. UserId هدف Long را در زمینه مشخص توضیح میدهد — خواننده بلافاصله متوجه میشود که این شناسه کاربر است، نه یک عدد دلخواه. با این حال typealias از ارسال Long معمولی به جایی که UserId انتظار میرود محافظت نمیکند — برای این کار value class لازم است.
Typealias و inline class (value class) وظایف متفاوتی را حل میکنند، اگرچه هر دو یک نام جدید برای نوع معرفی میکنند. Typealias فقط یک مترادف است: متغیر از نوع UserId = Long هر Long را بدون بررسی میپذیرد. Inline class مقدار را در نوع جدیدی میپیچد که در مرحله کامپایل بررسی میشود: ارسال Long معمولی به جایی که inline class UserId انتظار میرود بدون تبدیل صریح غیرممکن است.
| ویژگی | Typealias | Inline class |
|---|---|---|
| نوع جدید | خیر — مترادف اصل | بله — نوع جدید با بررسی |
| عملکرد | صفر — کاملاً پاک میشود | صفر — بستهبندی در بایتکد حذف میشود |
| وراثت | خیر | خیر (final class) |
| روشهای خاص | خیر | بله — میتوان توابع اعلان کرد |
| ایمنی نوع | خیر — قابل جایگزینی با اصل | بله — کامپایلر انواع را تشخیص میدهد |
جدول تفاوت بین دو مکانیسم را نشان میدهد. Typealias برای نامهای کوتاه و مستندسازی کد مناسب است، زمانی که تایپسازی سختگیرانه لازم نیست. Inline class از طریق کلمه کلیدی value class (قبلاً inline class) زمانی نیاز است که تشخیص مقادیر معنایی متفاوت از یک نوع اولیه مهم باشد. مثلاً UserId و OrderId هر دو Long هستند، اما ارسال یکی به جای دیگری یک خطای منطقی است که value class در مرحله کامپایل از آن جلوگیری میکند.
سوالات متداول
Import alias (import com.example.LongName as Short) در سطح import کار میکند — نام را فقط در فایل جاری کوتاه میکند. Typealias یک نام مستعار سراسری اعلان میکند که پس از import در کل پروژه قابل دسترسی است.
بله، typealias از تعاریف بازگشتی برای انواع تابعی پشتیبانی میکند، اما با احتیاط: typealias Rec
خیر، typealias کاملاً در مرحله کامپایل پاک میشود. در بایتکد و زمان اجرا از نوع اصلی بدون هیچ بستهبندی استفاده میشود. عملکرد مشابه استفاده مستقیم از نوع اصلی است.
Typealias میتواند به typealias دیگری ارجاع دهد — این زنجیره نامهای مستعار نامیده میشود. عمق زنجیره به صورت رسمی محدود نیست، اما برای خوانایی توصیه میشود بیش از 2–3 سطح نباشد. کامپایلر زنجیره را کاملاً در مرحله تحلیل باز میکند.
خیر، typealias یک اعلان سطح بالا یا عضو کلاس/شیء است. درون توابع نمیتوان typealias اعلان کرد. برای کوتاهسازی محلی انواع از import alias در داخل فایل استفاده کنید یا typealias را به سطح ماژول ببرید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید