Tool.Yun
डेवलपर्स के लिए उपयोगी उपकरण
YAML को JSON में परिवर्तित करने वाला कनवर्टर
YAML को सुंदर बनाएं और प्रारूपित करें
YAML फ़्लैटनर/अनफ़्लैटनर
YAML विलय
YAML से TOML में रूपांतरण
HTML को मार्कडाउन में बदलना
Markdown को DOCX में बदलें
tools.markdown-format-converter.name
ईपब से मार्कडाउन
मार्कडाउन अंतर
मार्कडाउन के रूप में पेस्ट करें
मार्कडाउन को एचटीएमएल में बदलें
मार्कडाउन को टेक्स्ट में बदलें
मार्कडाउन टीओसी जनरेटर
मार्कडाउन टेबल जनरेटर
मार्कडाउन टेबल प्रेटिफायर
मार्कडाउन पूर्वावलोकन
मार्कडाउन लोरेम इप्सम
मार्कडाउन संपादक
मार्कडाउन से डेटा
EXIF हटाएं
GIF को MP4 में बदलें
ICO/PNG कनवर्टर
इमेज EXIF/मेटाडेटा/GPS/JPEG क्वालिटी रीडर
एचईआईसी कनवर्टर
एसवीजी पूर्वावलोकनकर्ता
कैमरा रिकॉर्डर
छवि आकार बदलने वाला
छवि और पीडीएफ का OCR परीक्षण करें
छवि की पृष्ठभूमि हटाएं
छवि को SVG में रूपांतरित करें (पोट्रेस)
छवि तुलना
छवि प्रारूप कनवर्टर
छवि रंग इन्वर्टर
छवि सुधारें # क्रॉप इमेज फोटो एडिटर
वाटर-मार्क
ObjGen से HTML
XML लिंटर
XML से JSON में रूपांतरण
XML स्वरूपक
XSLT परीक्षक
एक्सपाथ परीक्षक
Base64 फ़ाइल कनवर्टर
CSV से डेटा
dBm mW कनवर्टर
ईमेल नॉर्मलाइज़र
ऊर्जा खपत और व्यय कंप्यूटर
एक्सेल से डेटा
कई इकाइयों का कनवर्टर
टेक्स्ट को UTF-8 बाइनरी में रूपांतरित करें
टेक्स्ट को यूनिकोड में बदलें
टोरेंट से मैग्नेट तक
डेटा स्टोरेज यूनिट कनवर्टर
पर्यावरण चर प्रारूप कनवर्टर
पूर्णांक आधार कनवर्टर
प्रॉपर्टीज़ कनवर्टर
बेस64 स्ट्रिंग एनकोडर/डिकोडर
बेस64 हेक्स ऐरे एनकोडर/डिकोडर
भौगोलिक निर्देशांक कनवर्टर
यूएलआईडी जनरेटर
यूनिकोड वर्णों को जावा एंटिटी में परिवर्तित करने वाला
रोमन अंक परिवर्तक
Ansible vault crypt decrypt
Bech32 एनकोडर/डिकोडर
ECDSA कुंजी युग्म जनरेटर
Ed25519 कुंजी जोड़ी जनरेटर
RSA एन्क्रिप्शन
RSA कुंजी जोड़ी जनरेटर
RSA/DSA/ECDSA हस्ताक्षरकर्ता और सत्यापनकर्ता
SAML पार्सर
X509 प्रमाणपत्र जनरेटर
आर्गन2 हैशर
एचमैक जनरेटर
एजीई क्रिप्टोग्राफी
एसएसएल प्रमाणपत्र कनवर्टर
जेडब्ल्यूटी जनरेटर
जेडब्ल्यूटी पार्सर
जैसिप्ट स्ट्रिंग एन्क्रिप्शन
टेक्स्ट को एन्क्रिप्ट/डिक्रिप्ट करें
नाइसवेयर बाइट्स से पासफ़्रेज़ तक
पासेटो/पासेर्क लोकल
पासेटो/पासेर्क सार्वजनिक/निजी
पीजीपी एन्क्रिप्शन
पीजीपी कीजेन
पीजीपी फ़ाइल एन्क्रिप्शन
प्रमाणपत्र/कुंजी पार्सर
फ़ाइल हैशर
बीक्रिप्ट
शमीर के गुप्त रहस्यों का साझाकरण
सीआरसी कैलकुलेटर
सीएसआर जनरेटर
हैश टेक्स्ट
गणित ओसीआर
गणित प्रारूप कनवर्टर
गणित मूल्यांकनकर्ता
टिप कैलकुलेटर
त्रिकोणमितीय/समीकरण वक्र दृश्यक
बाइनरी कैलकुलेटर
क्रॉन एक्सप्रेशन बिल्डर
JSONPath सिंटैक्स चीटशीट
K8 चीटशीट
Nginx चीटशीट
Tmux कमांड चीटशीट
VIM चीटशीट
XPath सिंटैक्स चीटशीट
chmod कमांड चीटशीट
गिट चीटशीट
गिट सिमेंटिक कमिट चीटशीट
ज़ेलिज कमांड चीटशीट
जेक्यू चीटशीट
डॉकर कंपोज़ चीटशीट
डॉकर चीटशीट
डॉकर स्वार्म चीटशीट
डॉकरफ़ाइल चीटशीट
नैनो चीटशीट
पॉवरशेल चीटशीट
बैश चीटशीट
मार्कडाउन चीट शीट
रेगुलर एक्सप्रेशन चीटशीट
सामान्य रेगुलर एक्सप्रेशन चीटशीट
सीएसएस सिलेक्टर्स चीटशीट
सेड चीटशीट
स्क्रीन कमांड चीटशीट
कार्ड पिकर
पासा रोलर
भाग्य का पहिया
सिक्का पलटने वाला
CSV से JSON में रूपांतरण
JS से JSON कनवर्टर
JSON to Go
JSON अंतर
JSON आकार विश्लेषक
JSON एस्केपर/अनएस्केपर
JSON को .env फ़ाइल में बदलें
JSON को C# में रूपांतरित करना
JSON को CSV में बदलें
JSON को JS में परिवर्तित करने वाला कनवर्टर
JSON को PHP कोड में परिवर्तित करें
JSON को PHP-Array में बदलना
JSON को Python में परिवर्तित करें
JSON को YAML में परिवर्तित करने वाला कनवर्टर
JSON को ऑब्जेक्ट में परिवर्तित करें
JSON को सुंदर बनाना और प्रारूपित करना
JSON क्वेरी
JSON फ़्लैटनर/अनफ़्लैटनर
JSON मिनिफाई
JSON लिंटर
JSON विलय
JSON संपादक
JSON से MessagePack
JSON से SQL DDL
JSON से TOML
JSON से TS
JSON से XML में रूपांतरण
JSON से जावा एंटिटी
JSON से डेटा
JSON से स्कीमा
JSON सॉर्ट मास्टर
JSON स्ट्रिंग कनवर्टर
Jq/JSONPath परीक्षक
ObjGen को JSON में परिवर्तित करें
PHP-Array को JSON में परिवर्तित करना
tools.json-patch.name
संदेश पैक को JSON में बदलें
BIP39 पासफ़्रेज़ जनरेटर
UUID कनवर्टर
UUID जनरेटर
ओटीपी कोड जनरेटर
टोकन जनरेटर
डाइसवेयर पासवर्ड जनरेटर
नैनोआईडी जनरेटर
पासफ़्रेज़ जनरेटर
पिन कोड जनरेटर
यादृच्छिक संख्या जनरेटर
संख्यावाचक नाम जनरेटर
TOML से JSON में रूपांतरण
TOML से YAML
टीओएमएल लिंटर
Docker Compose को .env फ़ाइल में स्थानांतरित करें
कुबेरनेट्स आरबीएसी जनरेटर
ट्रैफ़िक डॉकर कंपोज़ मेकर
डॉकर इंस्पेक्ट से डॉकर रन तक
डॉकर इमेज डाउनलोडर
डॉकर कंपोज़ को डॉकर रन में परिवर्तित करें
डॉकर कंपोज़ फॉर्मेट कनवर्टर
डॉकर कंपोज़ वैलिडेटर
डॉकर कंपोज़ से कुबेरनेट्स तक
डॉकर कंपोज़ से क्वाडलेट्स तक
डॉकर को कुबेरनेट्स पर चलाएं
डॉकर क्वाडलेट्स पर चलता है
डॉकर पैंगोलिन लेबल
डॉकर रन को डॉकर कंपोज़ में परिवर्तित करें
डॉकरफ़ाइल लेबल जनरेटर
ISBN वैलिडेटर और पार्सर
आईईएस प्रकाश दिशानिर्देश
आईएसओ 3166 देश कोड खोजक
आईएसओ 639 खोजकर्ता
आईबैन वैलिडेटर और पार्सर
आरएमबी अपरकेस कनवर्टर
एसएलए कैलकुलेटर
ऑनलाइन शब्दकोश
कैलेंडर कनवर्टर
क्रेडिट कार्ड चेकर
दौड़ने की गति कैलकुलेटर
फ़ोन पार्सर और फ़ॉर्मेटर
बीएमआई कैलकुलेटर
मुद्रा परिवर्तक
यूनिकोड खोज
लुह्न वैलिडेटर
वैट नंबर सत्यापनकर्ता
शेल कमांड की व्याख्या करें
सॉफ़्टवेयर लाइसेंस संगतता
ETA कैलकुलेटर
अवधि कैलकुलेटर
आईकैल विलय
आईसीएएल जनरेटर
आईसीएएल फ़ाइल पार्सर
उलटी गिनती
क्रॉन/सप्ताह के दिन का अलार्म
जिस दिन?
टाइमज़ोन कनवर्टर
टीटीएल कैलकुलेटर
ठीक घड़ी
दिनांक+अवधि कैलकुलेटर
दिनांक-समय परिवर्तक
दिनों की गणना
सप्ताह संख्या परिवर्तक
समय अलार्म
BIMI DNS जनरेटर
Chmod कैलकुलेटर
DMARC DNS जनरेटर
DNS क्वेरीज़
DNSBL चेकर
Htpasswd/htaccess जनरेटर
IPRange/CIDR/IPMask में IPv4-6/IPRange/CIDR
IPv4 पता कनवर्टर
IPv4 रेंज विस्तारक
IPv4 सबनेट कैलकुलेटर
IPv4/6 रेंज को CIDR में बदलने वाला कैलकुलेटर
IPv6 ULA जनरेटर
MAC एड्रेस लुकअप
RAID कैलकुलेटर
RAID विश्वसनीयता कैलकुलेटर
Rsync जनरेटर
Whois चेकर
X-VR-स्पैमकॉज़ डिकोडर
ZPOOL RAID कैलकुलेटर
ZPool चीटशीट
Zxcvbn पासवर्ड की मजबूती
tools.restic-command-generator.name
tools.url-redirection-checker.name
अपाचे लॉगरोटेट जनरेटर
आईपी जियो लोकेशन
आईपी सबनेट एक्सक्लूड कैलकुलेटर
आईपीटेबल्स जनरेटर
आईपीवी4 सबनेट सूची
आईपीवी4/6 सीआईडीआर से आईपी रेंज कैलकुलेटर
आईपीवी6 एड्रेस कनवर्टर
आईपीवी6 सबनेट कैलकुलेटर
एआरपीए डिकोडर
एचएएस सैनिटाइजर
एचटीएसेस जनरेटर
एचडीडी कैलकुलेटर
एनजिनक्स फॉर्मेटर
एफस्टैब जनरेटर
एसआईपी प्राधिकरण
एसपीएफ डीएनएस जनरेटर
कर्ल कमांड जनरेटर
क्रोनटैब जनरेटर
क्लाउडफ्लेयर DNS/RDAP क्वेरीज़
गुनगुनाहट
टीसीपी/यूडीपी पोर्ट परीक्षक
डब्ल्यूपीए पीएसके जनरेटर
डीकेआईएम डीएनएस जनरेटर
डेटा स्थानांतरण दर कैलकुलेटर
पासवर्ड शक्ति विश्लेषक
पीटीआर डीएनएस जनरेटर
पुनीकोड कनवर्टर
पूर्णांकों को IPv4/IPv6 में परिवर्तित करना
फायरवॉलडी कमांड लाइन जनरेटर
बंदरगाह संख्याएँ
बुनियादी प्रमाणीकरण जनरेटर
मल्टी लिंक डाउनलोडर
माइक्रोफ़ोन परीक्षक
मेरा आईपी पता
मैक एड्रेस कनवर्टर
मैक एड्रेस जनरेटर
यूएफडब्ल्यू कमांड जनरेटर
रैंडम पोर्ट जनरेटर
वायरगार्ड कॉन्फ़िगरेशन जनरेटर
विकल्प 43 जनरेटर
विज़ुअल सबनेट कैलकुलेटर
वेबसॉकेट परीक्षण
शटडाउन कमांड जनरेटर
शेल कमांड फॉर्मेटर
शेल कमांड्स लीनियराइज़र
HTML से PDF में रूपांतरण
पीडीएफ एन्क्रिप्ट
पीडीएफ कंप्रेसर
पीडीएफ को डिक्रिप्ट और अनलॉक करें
पीडीएफ टेक्स्ट एक्सट्रैक्टर
पीडीएफ पेज एक्सट्रैक्टर
पीडीएफ लीनियराइज़/फास्टवेब
पीडीएफ संयोजनकर्ता
पीडीएफ हस्ताक्षर परीक्षक
GZip/डिफ्लेट कनवर्टर
HTTPS परीक्षक
MongoDB ऑब्जेक्ट आईडी कनवर्टर
RJ45 Cat6 वायरिंग चीटशीट
आउटलुक एमएसजी पार्सर
आउटलुक सेफलिंक डिकोडर
ईएमवी टीएलवी डिकोडर
ईटीएच लेनदेन डिकोडर
ईमेल पार्सर
एक्टिवडायरेक्टरी एलडीएपी प्रॉपर्टीज सर्चर
एनमैप कमांड बिल्डर
एमआईएम एन्कोडिंग कनवर्टर
कुंजीकोड जानकारी
कुकी पार्सर
टीसीपीडींप जनरेटर
टेक्स्ट कैरेक्टर सेट डिटेक्टर/डिकोडर
डीएनएस परीक्षक
डीएनएस प्रसार परीक्षक
डीएमएआरसी रिपोर्ट विश्लेषक
डेड पिक्सेल परीक्षक
पार्केट फाइल रीडर
प्रतिरोधक कैलकुलेटर
फ़ाइल प्रकार डिटेक्टर
फ्लोटिंग पॉइंट संख्या कनवर्टर
बाउंस ईमेल पार्सर
मध्य-एंडियन कनवर्टर
यूआरएल पार्सर
यूआरएल बिल्डर
लघु यूआरएल विस्तारक
शेयरपॉइंट शेयर यूआरएल डिकोडर
संवेदनशील डेटा मास्कर
सीरियल पोर्ट कंसोल
स्नोफ्लेक आईडी एक्सट्रैक्टर
स्मार्ट रॉ कनवर्टर
हेक्स एनकोडर/डिकोडर
键盘测试器
GTIN वैलिडेटर
tools.epc-qrcode-generator.name
क्यूआर कोड जनरेटर
क्यूआर कोड डिकोडर
क्यूआर संपर्क जानकारी जनरेटर
बारकोड जनरेटर
बारकोड रीडर
वाईफाई क्यूआर कोड जनरेटर
आयतन प्रवाह दर कनवर्टर
ऊर्जा इकाई परिवर्तक
एसआई उपसर्ग कनवर्टर
कोण इकाई कनवर्टर
क्षेत्रफल इकाई परिवर्तक
खाद्य ऊर्जा परिवर्तक
तापमान परिवर्तक
त्वरण कनवर्टर
दबाव इकाई कनवर्टर
द्रव्यमान इकाई परिवर्तक
पावर कनवर्टर
प्रकाश कनवर्टर
फिटनेस कंप्यूटर
फ्रिक्वेंसी परिवर्तक
बल इकाई परिवर्तक
लंबाई इकाई परिवर्तक
वॉल्यूम यूनिट कनवर्टर
स्पीड कन्वर्टर
आस्पेक्ट रेशियो कैलकुलेटर
प्रतिशत कैलकुलेटर
बेंचमार्क निर्माता
भौगोलिक दूरी कैलकुलेटर
JSON से TOON
TOON से JSON
Tab बटन दबाकर Spaces पर जाएं
आरएसवीपी रीडर
इमोजी चयनकर्ता
उद्धरण जनरेटर
एआई के लिए पैक फ़ाइलें
एआई प्रॉम्प्ट स्प्लिटर
एएससीआईआई आर्ट टेक्स्ट जनरेटर
एचटीएमएल से टेक्स्ट निकालें
कीबोर्ड लेआउट कनवर्टर
केस कनवर्टर
छवि को ASCII आर्ट में रूपांतरित करें
ज़ाल्गो जनरेटर/बैनर
जीपीटी टोकन अनुमानक
जीपीटी टोकन एनकोडर/डिकोडर
टेक्स्ट को यूनिकोड नामों में बदलना
डुप्लिकेट लाइन खोजक
नमस्कार, जनरेटर।
नाटो वर्णमाला में पाठ
पाठ अंतर
पाठ अनुवादक
पाठ सांख्यिकी
फ़ॉन्ट तुलना
फ़ोल्डर संरचना आरेख
मत्स्यांगना निर्यातक
मैं और एल चेकर
मोर्स कोड कनवर्टर
यूनिकोड से जीएसएम-7
यूनिकोड स्वरूपक
रूण कनवर्टर
रेगुलर एक्सप्रेशन टेस्टर
रैंडम लाइन पिकर
लेवेनस्टीन कैलकुलेटर
विशिष्ट शब्द
सूचियों की तुलना करें
सूची कनवर्टर
सेड कमांड जनरेटर
सोशल लिंक शेयरर
स्ट्रिंग ऑबफस्केटर
स्मार्ट टेक्स्ट रिप्लेसर और लाइनब्रेकर
CLI कमांड संपादक
CSS/JS प्रेटिफ़ाई और मिनिमाइज़
Django सीक्रेट जेनरेटर
JSON को TypeScript में परिवर्तित करें
JSON से Protobuf में रूपांतरण
JSON से SQL में डेटा आयात करें
K6 लोड टेस्टिंग स्क्रिप्ट जनरेटर
SQL को सुंदर बनाना और प्रारूपित करना
SQL पैरामीटर जनरेटर
SQL मिनिफायर
उद्धरण कनवर्टर
एएनएसआई एस्केप टेस्टर
एपीआई परीक्षण
ओपन ग्राफ़ मेटा जनरेटर
कर्ल कनवर्टर
कोड/स्क्रिप्ट हाइलाइटर
गिट एट्रिब्यूट्स जेनरेटर
गिटइग्नोर जनरेटर
जावास्क्रिप्ट अनऑबफस्केटर/अनपैकर
जावास्क्रिप्ट ऑबफस्केटर
जावास्क्रिप्ट प्रेटिफायर
डेटा जालसाज़
डेटाबेस कनेक्शन स्ट्रिंग बिल्डर
डेटाबेस टेबल जनरेटर
डेटाबेस निर्माण बिल्डर
पिकोमैच परीक्षक
पोमोडोरो टाइमर
फ़ाइल स्प्लिटर
फेविकॉन जनरेटर
मेलटो जनरेटर
स्टैकट्रेस और भी सुंदर
स्ट्रिंग एस्केपर
स्वैगर यूआई परीक्षक
हेक्स फ़ाइल कनवर्टर
परिशोधन कैलकुलेटर
HTML एंटिटी से बाहर निकलें
HTML क्लीनर
HTML मिनिफायर
HTML से XHTML
HTML से डेटा
HTTP स्थिति कोड
REM पिक्सेल कनवर्टर
SVG प्लेसहोल्डर जनरेटर
उपयोगकर्ता-एजेंट पार्सर
एचटीएमएल डब्ल्यूवाईएसआईडब्ल्यूवाईजी संपादक
एचटीएमएल प्रेटिफायर
एमआईएम प्रकार
छवि को सीएसएस में बदलें
डिवाइस की जानकारी
यूआरएल कैचर
यूआरएल क्लीनर
यूआरएल टेक्स्ट सर्च फ़्रैगमेंट मेकर
यूआरएल स्वरूपित स्ट्रिंग को एन्कोड/डिकोड करें
यूटीएम यूआरएल जनरेटर
रंग कंट्रास्ट चेकर
रंग कनवर्टर
रंग पहिया
सीएसएस एक्सपाथ कनवर्टर
सीएसएस ग्रेडिएंट जनरेटर
सीएसएस प्रेटिफायर
सीएसएस यूनिट्स कन्वर्टर
स्लगिफ़ाई स्ट्रिंग

JSON को TypeScript में परिवर्तित करें

JSON को TypeScript कोड में बदलें
JSON को TypeScript में बदलना
 
केवल इंटरफेस का उपयोग करें
 
प्रॉपर्टी नामों को जावास्क्रिप्ट में रूपांतरित करें
 
यूनियनों को स्पष्ट रूप से नाम दें
 
रनटाइम पर JSON.parse परिणामों को सत्यापित करें
 
एनम के बजाय यूनियन टाइप का उपयोग करें
 
इंटरफेस के बजाय टाइप का उपयोग करें
 
एकल मान वाले एनम के लिए एनम के बजाय स्ट्रिंग का उपयोग करें
 
रीडओनली टाइप सदस्यों का उपयोग करें
 
सभी प्रॉपर्टीज़ को वैकल्पिक बनाएं
आपका टाइपस्क्रिप्ट कोड
// To parse this data:
//
//   import { Convert, MyType } from "./file";
//
//   const myType = Convert.toMyType(json);
//
// These functions will throw an error if the JSON doesn't
// match the expected interface, even if the JSON is valid.

export interface MyType {
    a:      string;
    arr:    number[];
    nested: Nested;
}

export interface Nested {
    a: number;
    b: string;
}

// Converts JSON strings to/from your types
// and asserts the results of JSON.parse at runtime
export class Convert {
    public static toMyType(json: string): MyType {
        return cast(JSON.parse(json), r("MyType"));
    }

    public static myTypeToJson(value: MyType): string {
        return JSON.stringify(uncast(value, r("MyType")), null, 2);
    }
}

function invalidValue(typ: any, val: any, key: any, parent: any = ''): never {
    const prettyTyp = prettyTypeName(typ);
    const parentText = parent ? ` on ${parent}` : '';
    const keyText = key ? ` for key "${key}"` : '';
    throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
}

function prettyTypeName(typ: any): string {
    if (Array.isArray(typ)) {
        if (typ.length === 2 && typ[0] === undefined) {
            return `an optional ${prettyTypeName(typ[1])}`;
        } else {
            return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
        }
    } else if (typeof typ === "object" && typ.literal !== undefined) {
        return typ.literal;
    } else {
        return typeof typ;
    }
}

function jsonToJSProps(typ: any): any {
    if (typ.jsonToJS === undefined) {
        const map: any = {};
        typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ });
        typ.jsonToJS = map;
    }
    return typ.jsonToJS;
}

function jsToJSONProps(typ: any): any {
    if (typ.jsToJSON === undefined) {
        const map: any = {};
        typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ });
        typ.jsToJSON = map;
    }
    return typ.jsToJSON;
}

function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any {
    function transformPrimitive(typ: string, val: any): any {
        if (typeof typ === typeof val) return val;
        return invalidValue(typ, val, key, parent);
    }

    function transformUnion(typs: any[], val: any): any {
        // val must validate against one typ in typs
        const l = typs.length;
        for (let i = 0; i < l; i++) {
            const typ = typs[i];
            try {
                return transform(val, typ, getProps);
            } catch (_) {}
        }
        return invalidValue(typs, val, key, parent);
    }

    function transformEnum(cases: string[], val: any): any {
        if (cases.indexOf(val) !== -1) return val;
        return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
    }

    function transformArray(typ: any, val: any): any {
        // val must be an array with no invalid elements
        if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
        return val.map(el => transform(el, typ, getProps));
    }

    function transformDate(val: any): any {
        if (val === null) {
            return null;
        }
        const d = new Date(val);
        if (isNaN(d.valueOf())) {
            return invalidValue(l("Date"), val, key, parent);
        }
        return d;
    }

    function transformObject(props: { [k: string]: any }, additional: any, val: any): any {
        if (val === null || typeof val !== "object" || Array.isArray(val)) {
            return invalidValue(l(ref || "object"), val, key, parent);
        }
        const result: any = {};
        Object.getOwnPropertyNames(props).forEach(key => {
            const prop = props[key];
            const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
            result[prop.key] = transform(v, prop.typ, getProps, key, ref);
        });
        Object.getOwnPropertyNames(val).forEach(key => {
            if (!Object.prototype.hasOwnProperty.call(props, key)) {
                result[key] = transform(val[key], additional, getProps, key, ref);
            }
        });
        return result;
    }

    if (typ === "any") return val;
    if (typ === null) {
        if (val === null) return val;
        return invalidValue(typ, val, key, parent);
    }
    if (typ === false) return invalidValue(typ, val, key, parent);
    let ref: any = undefined;
    while (typeof typ === "object" && typ.ref !== undefined) {
        ref = typ.ref;
        typ = typeMap[typ.ref];
    }
    if (Array.isArray(typ)) return transformEnum(typ, val);
    if (typeof typ === "object") {
        return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
            : typ.hasOwnProperty("arrayItems")    ? transformArray(typ.arrayItems, val)
            : typ.hasOwnProperty("props")         ? transformObject(getProps(typ), typ.additional, val)
            : invalidValue(typ, val, key, parent);
    }
    // Numbers can be parsed by Date but shouldn't be.
    if (typ === Date && typeof val !== "number") return transformDate(val);
    return transformPrimitive(typ, val);
}

function cast<T>(val: any, typ: any): T {
    return transform(val, typ, jsonToJSProps);
}

function uncast<T>(val: T, typ: any): any {
    return transform(val, typ, jsToJSONProps);
}

function l(typ: any) {
    return { literal: typ };
}

function a(typ: any) {
    return { arrayItems: typ };
}

function u(...typs: any[]) {
    return { unionMembers: typs };
}

function o(props: any[], additional: any) {
    return { props, additional };
}

function m(additional: any) {
    return { props: [], additional };
}

function r(name: string) {
    return { ref: name };
}

const typeMap: any = {
    "MyType": o([
        { json: "a", js: "a", typ: "" },
        { json: "arr", js: "arr", typ: a(0) },
        { json: "nested", js: "nested", typ: r("Nested") },
    ], false),
    "Nested": o([
        { json: "a", js: "a", typ: 0 },
        { json: "b", js: "b", typ: "" },
    ], false),
};