TypeScript अंतिम ओवरलोड का अनुमान लगाता है
जब आप overloaded functions का उपयोग करते हैं, तो TypeScript का एक विशिष्ट व्यवहार होता है।
जब आप किसी overloaded function से type का अनुमान लगाने की कोशिश करते हैं, तो TypeScript आपको केवल अंतिम signature ही देता है।
मुझे इसका सामना i18next के साथ काम करते समय हुआ। मैं string keys को कुछ बेहतर बनाना चाहता था। मैं autocomplete और बेहतर developer experience चाहता था। ऐसा करने के लिए, मुझे मौजूदा function types को transform करने की आवश्यकता थी।
समस्या: मुझे एक overloaded type से हर एक call signature निकालने की आवश्यकता थी।
Standard TypeScript आपको ऐसा करने का कोई तरीका नहीं देता है। अधिकांश समाधान hardcoded tables का उपयोग करते हैं, जैसे कि केवल 5 या 10 overloads का समर्थन करना। मैं signatures की किसी भी संख्या को संभालने का तरीका चाहता था।
मैंने intersections के साथ प्रयोग करके एक समाधान खोजा।
यहाँ इसका logic है:
- TypeScript अंतिम signature से infer करता है।
- Intersections (&) signatures के क्रम को बदल सकते हैं।
- यदि आप क्रम बदलते हैं, तो आप वह बदल देते हैं जिसे TypeScript infer करते समय देखता है।
मैंने पाया कि एक overloaded type को उसके अपने ही किसी एक signature के साथ intersect करने से वह signature लिस्ट में सबसे आगे आ जाता है।
इसने मुझे एक recursive type बनाने की अनुमति दी।
यह प्रक्रिया इस प्रकार काम करती है:
- अंतिम दिखाई देने वाले signature का अनुमान लगाएं।
- alignment बदलने के लिए एक intersection का उपयोग करें।
- यह अगले signature को नया अंतिम signature बनने के लिए मजबूर करता है।
- तब तक दोहराएं जब तक कि आपने एक union में हर signature को capture न कर लिया हो।
एक बार जब आप overloads को union में बदल देते हैं, तो आप उन्हें data की तरह मान सकते हैं। आप उन्हें transform कर सकते हैं, return types को Promises में wrap कर सकते हैं, या arguments का नाम बदल सकते हैं। Transformation के बाद, आप overloaded function को बहाल करने के लिए union को वापस intersection में बदल सकते हैं।
पूरा pipeline इस प्रकार दिखता है: Overloads -> Union -> Transform -> Intersection -> Overloads.
यह एक type-system trick है। यह कोई official API नहीं है। यह इस बात पर निर्भर करता है कि TypeScript intersections और call signatures का evaluation कैसे करता है। यदि आप इसे किसी library में उपयोग करते हैं, तो इसे विभिन्न TypeScript versions पर test करें।
कभी-कभी TypeScript के अजीब हिस्से ही सबसे उपयोगी होते हैं।
Source: https://dev.to/svs-nickm/typescript-infers-the-last-overload-so-i-changed-the-order-3018
