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

Kotlin میں typealias کا سب سے عام استعمال فعلی اقسام کے لیے ہے۔ (Int, String) -> Boolean یا (List) -> Result جیسے لمبے دستخط کوڈ کو پڑھنا مشکل بناتے ہیں۔ Typealias انہیں مختصر معنی خیز ناموں میں بدل دیتا ہے جو فنکشن کے مقصد کو دستاویز کرتے ہیں: typealias Validator = (String) -> Boolean بتاتا ہے کہ یہ ایک سٹرنگ توثیق کنندہ ہے۔

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

// With typealias
typealias UserFilter = (List<User>) -> List<User>

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

// Usage in class
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
// Generic 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 type is (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
// Alias for nested class
class NetworkResponse {
    class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error

// Alias for long library type
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 کا عرفی نام ہے۔ 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 ایک قدر کو ایک نئی قسم میں لپیٹتا ہے جسے مرتب وقت پر جانچا جاتا ہے: جہاں inline class UserId کی توقع ہو وہاں واضح تبدیلی کے بغیر ایک سادہ Long بھیجنا ناممکن ہے۔

خصوصیتTypealiasInline class
نئی قسمنہیں — اصل کا مترادفہاں — جانچوں کے ساتھ نئی قسم
کارکردگیصفر — مکمل طور پر مٹ جاتی ہےصفر — بائٹ کوڈ میں ریپر ہٹا دیا جاتا ہے
وراثتنہیںنہیں (حتمی کلاس)
اپنے طریقےنہیںہاں — فنکشن اعلان کیے جا سکتے ہیں
قسم کی حفاظتنہیں — اصل کے ساتھ قابل تبادلہہاں — مرتب کرنے والا اقسام میں فرق کرتا ہے

جدول دونوں میکانزم کے درمیان فرق ظاہر کرتا ہے۔ Typealias مختصر ناموں اور کوڈ دستاویز کاری کے لیے موزوں ہے جب سخت ٹائپنگ کی ضرورت نہ ہو۔ value class کلیدی لفظ (پہلے inline class) کے ذریعے Inline class کی ضرورت ہوتی ہے جب ایک ہی ابتدائی قسم کی معنوی طور پر مختلف قدروں میں فرق کرنا اہم ہو۔ مثال کے طور پر، UserId اور OrderId دونوں Long ہیں، لیکن جہاں دوسرے کی توقع ہو وہاں ایک کو بھیجنا ایک منطقی غلطی ہے جسے value class مرتب وقت پر روکتا ہے۔

اکثر پوچھے گئے سوالات

Typealias import alias سے کیسے مختلف ہے؟

Import alias (import com.example.LongName as Short) درآمد کی سطح پر کام کرتا ہے — یہ صرف موجودہ فائل میں نام کو مختصر کرتا ہے۔ Typealias ایک عالمی عرفی نام کا اعلان کرتا ہے جو درآمد کے بعد پورے پروجیکٹ میں دستیاب ہوتا ہے۔

کیا 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں