निम्नलिखित कोड टाइपस्क्रिप्ट कंपाइलर को क्यों पास करता है?

type O = {
  name: string
  city: string
}

function returnString(s: string) {
  return s
}

let o1: O = {
  name: "Marc",
  city: "Paris",
  [returnString("random")]: "London",
}
2
Take 21 फरवरी 2020, 06:32
1
एक कंपाइलर बग की तरह दिखता है, हो सकता है? microsoft/TypeScript#22427 बिल्कुल सही समस्या लगती है लेकिन इसे "फिक्स्ड" के रूप में बंद कर दिया गया था हालांकि यह निश्चित रूप से मुझे निश्चित नहीं लगता
 – 
jcalz
21 फरवरी 2020, 06:42
3
ठीक है, मैंने अभी-अभी microsoft/TypeScript#36920 खोला है और मैं जानकारी पोस्ट करने के लिए वापस आऊंगा यहाँ अगर मुझे उत्तर मिलता है कि क्या हो रहा है। आपको कामयाबी मिले
 – 
jcalz
21 फरवरी 2020, 07:26
यह अच्छा है ! (+1)
 – 
Maciej Sikora
21 फरवरी 2020, 11:37

2 जवाब

यह आपको आश्चर्यचकित क्यों करता है?

कोड गुजरता है, क्योंकि एक बात के लिए, यह ES2015 के अनुसार वैध सादा-पुराना जावास्क्रिप्ट है।

भले ही यह वैध जावास्क्रिप्ट नहीं था, क्योंकि इस कोड का जावास्क्रिप्ट में अनुवाद किया जा सकता है जो सीधे गणना किए गए कुंजी मानों का समर्थन नहीं करता है, और यह करने में सक्षम होने के लिए यह एक बहुत अच्छी, सुविधाजनक चीज है ... इसका समर्थन क्यों नहीं करते?

ES2015 के रूप में:

"use strict";
function returnString(s) {
    return s;
}
let o1 = {
    name: "Marc",
    city: "Paris",
    [returnString("random")]: "London",
};

ES5 में स्थानांतरित:

"use strict";
var _a;
function returnString(s) {
    return s;
}
var o1 = (_a = {
        name: "Marc",
        city: "Paris"
    },
    _a[returnString("random")] = "London",
    _a);
0
kshetline 21 फरवरी 2020, 06:44
1
क्योंकि यह मुझे इस कारण से असंगत लगता है कि मैं इसके बजाय random: "London", दर्ज नहीं कर सका।
 – 
Take
21 फरवरी 2020, 06:46
1
इस उत्तर का तात्पर्य है कि वैध जावास्क्रिप्ट का परिणाम टाइपस्क्रिप्ट कंपाइलर चेतावनी में नहीं होना चाहिए, लेकिन यह काम करने का तरीका नहीं है (यह भी देखें < a href="https://stackoverflow.com/questions/41750390/what-does-all-legal-javascript-is-legal-typescript-mean">यह q&a)
 – 
jcalz
21 फरवरी 2020, 06:57
विशेष रूप से, यह प्रश्न पूछ रहा है कि गणना की गई संपत्ति को जोड़ने से अतिरिक्त संपत्ति चेतावनियां। उत्तर "क्योंकि यह मान्य ES2015 है" नहीं हो सकता। यह हो सकता है "क्योंकि टीएस अनुरक्षकों ने फैसला किया कि यह मुहावरेदार जेएस है और इसे चेतावनी नहीं दी जानी चाहिए", लेकिन इसके लिए एक दस्तावेज लिंक या जीथब इश्यू लिंक या इसे वापस करने के लिए कुछ की आवश्यकता होगी। अन्यथा यह सिर्फ अनुमान/राय है।
 – 
jcalz
21 फरवरी 2020, 07:01

यह : never प्रकार के कारण है। मेरा मानना ​​​​है कि यह एक बहुत ही उन्नत टाइपस्क्रिप्ट अवधारणा है जिसका उपयोग आमतौर पर के लिए किया जाता है। भेदभाव वाली यूनियनें

यह एक पूर्ण उत्तर नहीं है लेकिन यह समस्या को समझने के लिए एक संकेत की तरह आपकी सेवा कर सकता है, यह स्ट्रिंग रिटर्न वैल्यू का दायरा खो देता है।

type O = {
  name: string
  city: string
}

declare const neverValue: never;

// This will fail
// function returnStringS(s: string): 's' {
//     return 's';
// }

// This will work
function returnStringS(s: string): string {
  return 's';
}

// This will work
function returnStringS(s: string): string {
  return s;
}


let o1: O = {
  name: "Marc",
  city: "Paris",
  [returnStringS("random")]: "London",
}

let o2: O = {
  name: "Marc",
  city: "Paris",
  [returnString("random")]: "London",
}

const some2: O = {
  name: "Marc",
  city: "Paris",
  [neverValue]: "London"
}

टाइपस्क्रिप्ट दस्तावेज़ में TS कभी नहीं टाइप करें इसकी कुंजी है मुद्दा / अवधारणा।

नेवर टाइप हर प्रकार का एक उपप्रकार है, और इसे असाइन करने योग्य है; हालांकि, कोई भी प्रकार उप-प्रकार नहीं है, या कभी भी असाइन करने योग्य नहीं है (स्वयं को छोड़कर)। यहां तक ​​कि कोई भी कभी भी असाइन करने योग्य नहीं है।

0
costadvl 21 फरवरी 2020, 12:53
यहां कोई never टाइप नहीं है। प्रश्न का returnString() रिटर्न string है, never का नहीं। यह string को वापस करने के लिए एनोटेट नहीं है, लेकिन कंपाइलर वैसे भी इसका अनुमान लगाता है। तो यह उत्तर प्रासंगिक नहीं लगता, जब तक कि मुझे कुछ याद नहीं आ रहा है। क्या आप विस्तार कर सकते हैं?
 – 
jcalz
21 फरवरी 2020, 18:18
मुद्दा यह है कि : never प्रकार ही एकमात्र प्रकार है जिसका उपयोग परिभाषित आकार इंटरफ़ेस या प्रकार का विस्तार करने के लिए किया जा सकता है, और चूंकि यह हर प्रकार के लिए असाइन करने योग्य है (जैसा कि दस्तावेज़ीकरण में लिखा गया है) जैसे : string यह समझा सकता है या कम से कम एक संकेत के रूप में कार्य कर सकता है कि यह : string क्यों स्वीकार करता है लेकिन : 's' परिभाषित स्ट्रिंग नहीं।
 – 
costadvl
24 फरवरी 2020, 12:49