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 पुनर्नामकरण है, आवरण नहीं।
Kotlin में typealias का सबसे सामान्य उपयोग फ़ंक्शनल प्रकारों के लिए है। (Int, String) -> Boolean या (List
// 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
Typealias सामान्य पैरामीटर (जेनेरिक्स) सपोर्ट करता है, जो इसे और भी लचीला बनाता है। आप typealias Mapper
// 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
नेस्टेड क्लासेस और लंबे पैरामीटरीकृत प्रकार एक और क्षेत्र हैं जहाँ typealias कोड को काफी सरल बनाता है। यदि कोई क्लास नेस्टिंग पदानुक्रम (Outer.Inner.Nested) में गहरी है, तो पूरे नाम से संदर्भ कोड को अव्यवस्थित करता है। Typealias ऐसी पहुँच को छोटा करता है और इसे अधिक पठनीय बनाता है। यह विशेष रूप से लंबे नामों वाली तृतीय-पक्ष लाइब्रेरी की क्लासेस के लिए प्रासंगिक है।
// 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 (value class) अलग-अलग समस्याओं का समाधान करते हैं, हालाँकि दोनों एक प्रकार के लिए एक नया नाम प्रस्तुत करते हैं। Typealias सिर्फ एक पर्याय है: UserId = Long प्रकार का एक चर बिना जाँच के किसी भी Long को स्वीकार करता है। Inline class एक मान को एक नए प्रकार में लपेटता है जिसे संकलन समय पर जाँचा जाता है: जहाँ inline class UserId अपेक्षित है वहाँ सादा Long पास करना स्पष्ट रूपांतरण के बिना असंभव है।
| विशेषता | Typealias | Inline class |
|---|---|---|
| नया प्रकार | नहीं — मूल का पर्याय | हाँ — जाँचों के साथ नया प्रकार |
| प्रदर्शन | शून्य — पूरी तरह मिट जाता है | शून्य — बाइटकोड में आवरण हटा दिया जाता है |
| वंशानुक्रम | नहीं | नहीं (अंतिम वर्ग) |
| स्वयं के तरीके | नहीं | हाँ — फ़ंक्शन घोषित किए जा सकते हैं |
| प्रकार सुरक्षा | नहीं — मूल के साथ विनिमेय | हाँ — संकलक प्रकारों में अंतर करता है |
तालिका दो क्रियाविधियों के बीच अंतर दिखाती है। Typealias संक्षिप्त नामों और कोड दस्तावेज़ीकरण के लिए उपयुक्त है जब सख्त टाइपिंग की आवश्यकता नहीं होती। value class कीवर्ड (पूर्व में inline class) के माध्यम से Inline class की आवश्यकता तब होती है जब एक ही आदिम प्रकार के शब्दार्थ रूप से भिन्न मानों के बीच अंतर करना महत्वपूर्ण हो। उदाहरण के लिए, UserId और OrderId दोनों Long हैं, लेकिन जहाँ दूसरे की अपेक्षा है वहाँ एक को पास करना एक तार्किक त्रुटि है जिसे value class संकलन समय पर रोकता है।
अक्सर पूछे जाने वाले प्रश्न
Import alias (import com.example.LongName as Short) आयात स्तर पर काम करता है — यह केवल वर्तमान फ़ाइल में नाम को छोटा करता है। Typealias एक वैश्विक उपनाम घोषित करता है जो आयात के बाद पूरे प्रोजेक्ट में उपलब्ध होता है।
हाँ, typealias फ़ंक्शनल प्रकारों के लिए पुनरावर्ती परिभाषाओं का समर्थन करता है, लेकिन सावधानी के साथ: typealias Rec
नहीं, typealias संकलन समय पर पूरी तरह से मिटा दिया जाता है। बाइटकोड और रनटाइम स्तर पर बिना किसी आवरण के मूल प्रकार का उपयोग किया जाता है। प्रदर्शन सीधे मूल प्रकार के उपयोग के समान है।
Typealias किसी अन्य typealias को संदर्भित कर सकता है — इसे उपनामों की श्रृंखला कहा जाता है। श्रृंखला की गहराई औपचारिक रूप से असीमित है, लेकिन पठनीयता के लिए 2–3 स्तरों से अधिक की अनुशंसा नहीं की जाती है। संकलक विश्लेषण चरण में श्रृंखला को पूरी तरह से हल करता है।
नहीं, typealias एक शीर्ष-स्तरीय घोषणा या क्लास/ऑब्जेक्ट का सदस्य है। फ़ंक्शन के अंदर typealias घोषित नहीं किया जा सकता। स्थानीय प्रकार संक्षिप्तीकरण के लिए, फ़ाइल के भीतर import alias का उपयोग करें या typealias को मॉड्यूल स्तर पर रखें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें