Typealias — چیست، نحو و کاربرد در Kotlin

نویسنده: IT Sectr منتشر شده: 2026-06-23 زمان مطالعه: 7 دقیقه

Typealias مکانیزمی در Kotlin برای ایجاد یک نام جایگزین برای نوع موجود است. کلمه کلیدی typealias به شما امکان می‌دهد اعلان نوع پیچیده را با یک نام مستعار کوتاه و قابل فهم جایگزین کنید، بدون ایجاد نوع جدید. طبق مستندات Kotlin (2026)، typealias خوانایی کد را بهبود می‌بخشد، به‌ویژه در امضای توابع با انواع تابعی. Typealias کد را خودمستند می‌کند و اعلان‌های طولانی را با انواع نام‌گذاری شده قابل فهم جایگزین می‌نماید.

نکات اصلی

  • Typealias — نام مستعار برای نوع موجود، بدون ایجاد نوع جدید
  • انواع تابعی — typealias انواع پیچیده (T) -> R را با نام‌های خوانا مانند Callback جایگزین می‌کند
  • جنریک‌ها — typealias از پارامترهای عمومی پشتیبانی می‌کند: typealias ListMapper = (T) -> T
  • کلاس‌های تو در تو — typealias دسترسی به کلاس‌های تو در تو از بسته‌های دیگر را کوتاه می‌کند
  • ایمنی نوع — 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 برای انواع تابعی

متداول‌ترین سناریوی استفاده از typealias در Kotlin انواع تابعی هستند. امضاهای طولانی مانند (Int, String) -> Boolean یا (List) -> Result خواندن کد را دشوار می‌کنند. Typealias آنها را به نام‌های کوتاه و معناداری تبدیل می‌کند که هدف تابع را مستند می‌سازند: typealias Validator = (String) -> Boolean مشخص می‌کند که این یک اعتبارسنجی رشته است.

kotlin
// بدون 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) -> List را پشت یک نام کوتاه پنهان می‌کند. امضای findUsers خوانا می‌شود: «UserFilter می‌گیرد، List برمی‌گرداند». Typealias OnClickListener کد را شبیه به اعلان اینترفیس می‌کند، اما بدون سربار ایجاد یک اینترفیس یا کلاس انتزاعی جداگانه. لامبداها و توابع ناشناس مانند قبل کار می‌کنند — typealias نیازی به تغییر در کد فراخوان ندارد.

Typealias با جنریک‌ها

Typealias از پارامترهای عمومی (جنریک‌ها) پشتیبانی می‌کند که آن را حتی انعطاف‌پذیرتر می‌سازد. می‌توان typealias Mapper = (T) -> R تعریف کرد و با هر نوعی استفاده نمود. کامپایلر در هر استفاده از نام مستعار، انواع مشخص را به جای پارامترها قرار می‌دهد و ایمنی کامل نوع را حفظ می‌کند.

kotlin
// 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 — یک نام مستعار عمومی برای هر تبدیل از T به R است. Provider — تأمین‌کننده مقدار (کارخانه بدون آرگومان). ListTransformer — تابع تبدیل لیست. در فراخوانی processNumbers(mapper: Mapper) کامپایلر نام مستعار را به (Int) -> String باز می‌کند. جنریک‌ها typealias را به ابزاری جهانی تبدیل می‌کنند که برای هر زمینه‌ای بدون تکرار اعلان‌ها مناسب است.

Typealias برای کلاس‌های تو در تو و نام‌های طولانی

کلاس‌های تو در تو و انواع طولانی پارامتری شده — حوزه دیگری که typealias به طور قابل توجهی کد را ساده می‌کند. اگر کلاسی عمیقاً در سلسله‌مراتب تودرتو قرار دارد (Outer.Inner.Nested)، ارجاع به آن با نام کامل کد را شلوغ می‌کند. Typealias این دسترسی را کوتاه و خواناتر می‌کند. این به‌ویژه برای کلاس‌های کتابخانه‌های شخص ثالث با نام‌های طولانی اهمیت دارد.

kotlin
// نام مستعار برای کلاس تو در تو
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: تفاوت‌ها

Typealias و inline class (value class) وظایف متفاوتی را حل می‌کنند، اگرچه هر دو یک نام جدید برای نوع معرفی می‌کنند. Typealias فقط یک مترادف است: متغیر از نوع UserId = Long هر Long را بدون بررسی می‌پذیرد. Inline class مقدار را در نوع جدیدی می‌پیچد که در مرحله کامپایل بررسی می‌شود: ارسال Long معمولی به جایی که inline class UserId انتظار می‌رود بدون تبدیل صریح غیرممکن است.

ویژگیTypealiasInline class
نوع جدیدخیر — مترادف اصلبله — نوع جدید با بررسی
عملکردصفر — کاملاً پاک می‌شودصفر — بسته‌بندی در بایت‌کد حذف می‌شود
وراثتخیرخیر (final class)
روش‌های خاصخیربله — می‌توان توابع اعلان کرد
ایمنی نوعخیر — قابل جایگزینی با اصلبله — کامپایلر انواع را تشخیص می‌دهد

جدول تفاوت بین دو مکانیسم را نشان می‌دهد. Typealias برای نام‌های کوتاه و مستندسازی کد مناسب است، زمانی که تایپ‌سازی سخت‌گیرانه لازم نیست. Inline class از طریق کلمه کلیدی value class (قبلاً inline class) زمانی نیاز است که تشخیص مقادیر معنایی متفاوت از یک نوع اولیه مهم باشد. مثلاً UserId و OrderId هر دو Long هستند، اما ارسال یکی به جای دیگری یک خطای منطقی است که value class در مرحله کامپایل از آن جلوگیری می‌کند.

سوالات متداول

تفاوت typealias با import alias چیست؟

Import alias (import com.example.LongName as Short) در سطح import کار می‌کند — نام را فقط در فایل جاری کوتاه می‌کند. Typealias یک نام مستعار سراسری اعلان می‌کند که پس از import در کل پروژه قابل دسترسی است.

آیا می‌توان از typealias برای ایجاد نوع بازگشتی استفاده کرد؟

بله، typealias از تعاریف بازگشتی برای انواع تابعی پشتیبانی می‌کند، اما با احتیاط: typealias Rec = (T) -> Rec کار می‌کند، اما ارجاعات بازگشتی به object — خیر. کامپایلر چرخه‌ها را بررسی کرده و برای تعاریف بی‌نهایت خطا می‌دهد.

آیا typealias بر عملکرد تأثیر می‌گذارد؟

خیر، typealias کاملاً در مرحله کامپایل پاک می‌شود. در بایت‌کد و زمان اجرا از نوع اصلی بدون هیچ بسته‌بندی استفاده می‌شود. عملکرد مشابه استفاده مستقیم از نوع اصلی است.

حداکثر سطح تودرتو برای typealias چقدر است؟

Typealias می‌تواند به typealias دیگری ارجاع دهد — این زنجیره نام‌های مستعار نامیده می‌شود. عمق زنجیره به صورت رسمی محدود نیست، اما برای خوانایی توصیه می‌شود بیش از 2–3 سطح نباشد. کامپایلر زنجیره را کاملاً در مرحله تحلیل باز می‌کند.

آیا می‌توان typealias را داخل تابع اعلان کرد؟

خیر، typealias یک اعلان سطح بالا یا عضو کلاس/شیء است. درون توابع نمی‌توان typealias اعلان کرد. برای کوتاه‌سازی محلی انواع از import alias در داخل فایل استفاده کنید یا typealias را به سطح ماژول ببرید.

خلاصه

  • Typealias — مترادفی برای نوع موجود، بدون ایجاد نوع جدید و پاک‌شونده در مرحله کامپایل
  • انواع تابعی — حوزه اصلی کاربرد: typealias (T) -> R را با نام خوانا مانند Callback جایگزین می‌کند
  • جنریک‌ها در typealias امکان ایجاد نام‌های مستعار عمومی Mapper برای هر نوع را فراهم می‌کنند
  • کلاس‌های تو در تو — typealias دسترسی به انواع عمیقاً تودرتو و نام‌های طولانی کتابخانه‌ها را کوتاه می‌کند
  • ایمنی نوع وجود ندارد: typealias کاملاً با نوع اصلی قابل جایگزینی است
  • Value class — جایگزینی برای typealias زمانی که بررسی نوع سخت‌گیرانه با هزینه صفر در زمان اجرا نیاز است
  • خوانایی — مزیت اصلی: نام‌های معنادار انواع، کد را بدون سربار خودمستند می‌کنند

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید