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 যেখানে UserId প্রত্যাশিত সেখানে একটি সাধারণ Long পাস করতে বাধা দেয় না — এর জন্য একটি 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন