मैं कैसे देख सकता हूं कि टाइपस्क्रिप्ट कैसे टाइप करता है?


18

समस्या: मैं एक ऐसी फ़ाइल पर काम कर रहा हूं जिसमें बहुत अधिक सशर्त प्रकार हैं जो पहले से परिभाषित सशर्त प्रकारों से अपने प्रकार प्राप्त करते हैं और यह बहुत जटिल और कठिन हो गया है कि कैसे एक प्रकार का व्युत्पन्न किया जा रहा है।

मैं "डिबग" या सूची का एक तरीका खोजने की कोशिश कर रहा हूं कि टाइपस्क्रिप्ट कंपाइलर एक सशर्त प्रकार पर अपना निर्धारण कैसे कर रहा है और अंतिम प्रकार प्राप्त करने के लिए एक रास्ता चुन रहा है।

मैं संकलक विकल्पों के माध्यम से देखा है और अभी तक उस क्षेत्र में कुछ भी नहीं मिला है ...

अभी जो मैं देख रहा हूं उसके अनुरूप एक DEBUG=express:*सेटिंग के प्रकार के बराबर है जो एक का उपयोग कर सकता है यदि आप यह देखना चाहते थे कि एक्सप्रेस सर्वर क्या कर रहा था।

हालाँकि, मैं जिस वास्तविक समस्या को हल करने की कोशिश कर रहा हूं, वह यह है कि कैसे एक प्रकार को बड़े जटिल पदानुक्रमित प्रकार की परिभाषा में व्युत्पन्न किया जा सकता है।

महत्वपूर्ण नोट: मैं टाइपस्क्रिप्ट प्रोजेक्ट के रनटाइम निष्पादन को डीबग करने का प्रयास नहीं कर रहा हूं। मैं डिबग करने की कोशिश कर रहा हूं कि टाइपस्क्रिप्ट कंपाइलर द्वारा प्रकारों की गणना कैसे की जाती है।


बस एक अच्छी आईडीई का उपयोग करें, अपने प्रकार को तुरंत लिखें और अपने संपादक में खोली गई स्रोत फ़ाइल में मूल्य पर होवर करें। क्या उस सुझाव का उपयोग करके कुछ अतिरिक्त वांछित जानकारी याद आती है?
पैट्रिक रॉबर्ट्स

@ पैट्रिक रॉबर्ट्स - उत्तर के लिए धन्यवाद। जब मैं ऐसा करता हूं तो यह एक जटिल प्रकार की ओर इशारा करता है जिसमें सशर्त प्रकार होते हैं। यह बदले में एक और समान जटिल प्रकार की ओर इशारा करता है और यह चलता रहता है और कभी-कभी यह ऐसे तरीके से शाखा करेगा जो स्पष्ट नहीं है। काम करने की कोशिश कर रहा है कि कैसे डिबग करें कि उस प्रकार की निर्माण शाखा क्यों हो रही है।
गाय

1
मुझे लगता है कि आपके प्रश्न को प्रदर्शित करने के लिए एक ठोस उदाहरण से लाभ होगा। मैंने उस स्थिति का भी सामना किया है जिसका वर्णन आप पहले कर रहे हैं, लेकिन आमतौर पर मुझे पता चलता है कि वर्कअराउंड में उन प्रकारों को फिर से लिखना शामिल है जैसे कि वे या तो अधिक अपारदर्शी हैं (उदाहरण के लिए जेनेरिक interfaceके बजाय स्व-दस्तावेजीकरण कंटेनर नाम के साथ एक जेनेरिक typeजो इसके विस्तार का प्रयास करता है आईडीई के टूलटिप में परिभाषा) या पूरी तरह से जटिल सशर्त प्रकारों के अति प्रयोग से बचने के लिए स्रोत को फिर से भरना।
पैट्रिक रॉबर्ट्स

@PatrickRoberts ने इस रेपो को हापी / जोई @ 16 में अपग्रेड करने की कोशिश की और टाइप जनरेशन को डिबग किया कि इस सवाल का क्या कारण है। github.com/TCMiranda/joi-extract-type
लड़के

@PatrickRoberts यह विशिष्ट समस्या है जो संदर्भ के लिए अपग्रेड पर चर्चा कर रही है। github.com/TCMiranda/joi-extract-type/issues/22
लड़के

जवाबों:


1

विचाराधीन वांछित जानकारी को लॉग आउट करने के लिए टाइपस्क्रिप्ट में कोई अंतर्निहित तंत्र नहीं है। हालांकि, यदि आप आंतरिक कार्य को समझने में रुचि रखते हैं, तो यहां स्रोत कोड में वह जगह है जहां वास्तव में सशर्त प्रकारों का समाधान होता है।

इन स्थानों पर एक नज़र डालें checker.ts

ln: 13258 instantiateTypeWorker()
ln: 12303 getConditionalType()
ln: 12385 getTypeFromConditionalTypeNode()
ln: 12,772getTypeFromTypeNode()


संलग्न एक आधा किया हुआ टाइपस्क्रिप्ट प्लगइन है जिसे मैंने लापरवाही से एक साथ रखा है। यह कच्चे डेटा संरचना को लॉग आउट करता है ConditionalType। इस संरचना को समझने के लिए, check.ts ln: 4634 देखें।

इस प्लगइन का यूएक्स भयानक है, लेकिन यह संरचना आपको बताती है कि टाइपस्क्रिप्ट एक सशर्त प्रकार का अंतिम मूल्य कैसे तय करती है।

इस प्लगइन को चलाने के लिए कुछ कष्टप्रद विस्तृत निर्देश:

  1. mkdir my-ts-plugin && cd my-ts-plugin
  2. touch package.json और लिखा { "name": "my-ts-plugin", "main": "index.js" }
  3. yarn add typescript fast-safe-stringify
  4. इस स्निपेट को कॉपी-पेस्ट करें index.ts, इसे संकलित करने के लिए tsc का उपयोग करेंindex.js
  5. yarn link
  6. अब cdअपने खुद के टीएस परियोजना के लिए, भागोyarn link my-ts-plugin
  7. { "compilerOptions": { "plugins": [{ "name": "my-ts-plugin" }] } }अपने को जोड़ेंtsconfig.json
  8. (.vscode/settings.json)इस पंक्ति को सेट करने के लिए कार्यस्थान में जोड़ें :{ "typescript.tsdk": "<PATH_TO_YOUR_TS_PROJECT>/node_modules/typescript/lib" }
  9. vscode कमांड पैलेट खोलें और चलाएं:
    1. TypeScript: Select TypeScript Version... -> Use Workspace Version
    2. TypeScript: Restart TS Server
    3. TypeScript: Open TS Server Log
  10. आपको प्लगइन लॉग आउट देखने में सक्षम होना चाहिए "PLUGIN UP AND RUNNING", अब कुछ सशर्त प्रकार के नोड के लिए एक ts कोड फ़ाइल और माउस होवर खोलें, आपको लॉग फ़ाइल में जोड़ा गया एक loooooong json डेटा स्ट्रक्चर देखना चाहिए।

उस @ थाप्पे के लिए धन्यवाद। मैं इसके साथ आसपास हैकिंग कर रहा हूं और कुछ लॉग का उत्पादन कर सकता हूं जो दिलचस्प और बहुत अधिक सूची में हैं जो मैं VSCode का उपयोग करते समय इंटरेक्टिव रूप से देख रहा हूं, इसलिए यह मुझे उस जगह से ज्यादा आगे नहीं मिला है जहां मैं था। उस प्लगइन को काम करने के तरीके के बारे में अच्छे निर्देश।
गाय

मैंने तुम्हें इनाम दिया। हालांकि यह मुझे उस समाधान के लिए नहीं मिला है जो मुझे लगता है कि मेरे द्वारा उस प्लगइन को संशोधित करने के अधिक प्रयास से मैं शायद वहां पहुंच सकता हूं और मैं यह नहीं सोच सकता कि निकट भविष्य में इसके लिए एक बेहतर समाधान हो सकता है। आपकी मदद और प्रयास के लिए धन्यवाद!
गाइ

1
@Guy इनाम के लिए धन्यवाद। इसलिए मैंने कल कुछ और घंटे बिताए और अधिक उपयोगी परिणाम प्राप्त करने की कोशिश कर रहा हूं। आप सही हे। ऊपर डेटा संरचना सशर्त प्रकार की श्रृंखला के एएसटी-ईश ऑब्जेक्ट को कैप्चर करता है, लेकिन यह केवल पार्स किया गया परिणाम है, न कि मूल्यांकन परिणाम। जैसा कि "क्यों" या किस सशर्त शाखा में टाइप रिज़ॉल्वर मूल्यांकन करते समय ले जाता है, इसके लिए सभी मध्यवर्ती चरणों के परिणाम डंपिंग की आवश्यकता होती है, थोड़े जैसे कि debuggerकहीं एक ठहराव डालने के लिए तो मैन्युअल रूप से कॉल स्टैक्स में स्थानीय स्कोप के माध्यम से देखें।
हैकप

1
मैं संशोधित getConditionalType()में checker.tsएक कस्टम निर्माण टाइपप्रति बनाने के लिए, कुछ पक्ष प्रभाव तर्क रास्ते मध्यवर्ती जानकारी बाहर फेंक डालने। और इस बार मुझे कुछ ज्यादा ही उपयोगी लगा। मैं अपने कोड को साफ करूंगा और बाद में एक जिस्ट संलग्न करूंगा।
हैकेप

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.