टाइपस्क्रिप्ट के साथ Object.values ​​का उपयोग कैसे करें?


135

मैं एक वस्तु से एक अलग अल्पविराम बनाने की कोशिश कर रहा हूँ,

const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"};
const values = Object.values(data).map(x => x.substr(0, x.length - 4));
const commaJoinedValues = values.join(',');
console.log(commaJoinedValues);

टाइपस्क्रिप्ट के साथ यह कैसे करें?

त्रुटि फ़ाइल प्राप्त करना:

severity: 'Error'
message: 'Property 'values' does not exist on type 'ObjectConstructor'.'
at: '216,27'
source: 'ts'

जवाबों:


106

इसके बजाय Object.keys का उपयोग करना।

const data = {
  a: "first",
  b: "second",
};

const values = Object.keys(data).map(key => data[key]);

const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);

90
ध्यान दें कि यह एक वैकल्पिक (एक अच्छा एक!) है, Object.valuesओपी की अनुपालन त्रुटि को हल करने के लिए ईएस 7 के टीएस का उपयोग करने के तरीके पर एक वास्तविक जवाब नहीं है । ऐसा करने के लिए आपको बस ES2017अपनी --libसेटिंग में जरूरत है ।
हारून बीलल

4
@ आपका समाधान इतना जटिल है कि टाइप करने के लिए कोई भी नया स्वीकार नहीं किया जा सकता है, यह संकलन करने के लिए आपको ES2017लिब को जोड़ना होगा , और इसमें पॉलीफ़िल्स लाइब्रेरी भी शामिल करनी चाहिए जहाँ इसका उपयोग करें। अलग-अलग लोगों के खिलाफ अलग-अलग जवाब देना राजा है।
होली-जावा

9
@ holi-jave यह "मेरा समाधान" नहीं है, बस यह कि कैसे TS और गैर-मानक जेएस सुविधाएँ काम करती हैं, जैसे कि ओपी का प्रयास है ES7/Object.values()। शायद आपको लगता है कि इसका जटिल (मैं असहमत नहीं हूं), लेकिन यह Object.values()आज की तरह भविष्य की सुविधाओं का उपयोग करने की कोशिश की प्रकृति है। इसका हमेशा यही तरीका रहा। यहां तक ​​कि Object.keys()अगर आप ES3 को लक्षित कर रहे थे, तो भी पॉलीफ़िल्ड होना चाहिए या IE8 का समर्थन करना चाहते हैं (उम्मीद है कि आप अब और नहीं!) यदि आप वेब विकास में हैं तो ES सुविधाओं, ब्राउज़र समर्थन और पॉलीफ़िलिंग को समझना सामान्य रूप से एक अच्छा विचार है।
हारून बिएल

@ ऐरन मैं नहीं कहा गया कि यह जटिल है, लेकिन किसी के लिए टाइपस्क्रिप्ट / जावास्क्रिप्ट के लिए नया अधिक जटिल है और स्वीकार नहीं किया जाता है।
होली-जावा


224

Object.values()ES2017 का हिस्सा है , और आपको जो संकलन त्रुटि मिल रही है, वह इसलिए है क्योंकि आपको ES2017 लाइब्रेरी का उपयोग करने के लिए TS को कॉन्फ़िगर करने की आवश्यकता है। आप शायद अपने वर्तमान टीएस विन्यास में ईएस 6 या ईएस 5 पुस्तकालय का उपयोग कर रहे हैं।

समाधान: उपयोग es2017या es2017.objectअपने --libसंकलक विकल्प में

उदाहरण के लिए, उपयोग करना tsconfig.json:

"compilerOptions": {
    "lib": ["es2017", "dom"]
}

ध्यान दें कि टाइपस्क्रिप्ट के साथ ES2017 को लक्षित करना ES2017 के लिए ब्राउज़र में पॉलीफ़िल्स का उत्सर्जन नहीं करता है (जिसका अर्थ है कि आपकी संकलन त्रुटि को हल करता है , लेकिन आप अभी भी रनटाइम त्रुटि का सामना कर सकते हैं क्योंकि ब्राउज़र ES2017 को लागू नहीं करता है Object.values), यह आपकी परियोजना को पॉलीफ़िल करने के लिए है। यदि आप चाहें तो अपने आप को कोड करें। और चूंकि Object.valuesअभी तक सभी ब्राउज़रों द्वारा (इस लेखन के समय) अच्छी तरह से समर्थित नहीं है , आप निश्चित रूप से एक पॉलीफिल चाहते हैं: कामcore-js करेंगे ।


1
@ErikvanVelzen आप जवाब के मामले को बदलने के लिए संपादित ES2017करने के लिए es2017लेकिन AFAIK इस necassary नहीं है, लेकिन मैं हमेशा सीखना चाहते हैं, वहाँ परिवर्तन के लिए एक कारण था?
एरोन बाइलल

2
^ अपने ही सवाल का जवाब करने के लिए: ES2017, DOM(अपरकेस) में सूचीबद्ध है tsc --initमान्य मान के रूप में टिप्पणी और यह संकलक में सही ढंग से काम करता है, लेकिन JSON स्कीमा केवल विश्लेषण करता है es2017, dom(लोअरकेस) विकल्प है, तो JSON आईडीई / लिंटर इच्छा झंडा ES2017, DOMके रूप में अमान्य मान (भले ही वे मान्य हों)। थोडा भ्रमित।
हारून बीलल

वास्तव में यही कारण था। जैसा कि आप ध्यान दें यह अपरकेस काम करता है। tsc --helpयद्यपि लोअरकेस प्रदर्शित करता है
एरिक वैन वेलजेन

क्या कोर-जेएस कोणीय में शामिल नहीं है, यदि ऐसा नहीं है कि इस पॉलीफ़िल को कैसे जोड़ा जाए?
समीउल्लाह खान

1
@ Totty.js पुस्तकालय की फाइलें जो TS शामिल हैं , केवल टाइप-चेकिंग के लिए हैं , दूसरे शब्दों में यह वास्तव में जेएस लाइब्रेरी पॉलीफिल जैसी चीजों के लिए किसी भी तरह का उत्सर्जन नहीं करता है Object.values()। दूसरे शब्दों में, आप संकलित त्रुटि के आसपास प्राप्त कर सकते हैं लेकिन फिर भी यदि आप एक ब्राउज़र में चलते हैं तो रनटाइम त्रुटियों में भाग लेते हैं Object.values()
एरॉन बाइलल

18

यदि आप किसी कारण से tsconfig में ES7 को अपडेट नहीं कर सकते हैं तो Object.valuesऐसा करके आप टाइपस्क्रिप्ट में उपयोग कर सकते हैं (<any>Object).values(data)


4
@Aaron पोस्टिंग के समय ऐसी टिप्पणियां थीं जो लोगों को यह बताती हैं कि एंगुलर के एक विशेष संस्करण का उपयोग करने से यह समस्या उत्पन्न होती है कि यह काम नहीं कर रहा है। यही कारण है कि मैं डालif for some reason you can't update to ES7 in tsconfig
mtpultz

11

के बजाय

Object.values(myObject);

उपयोग

Object["values"](myObject);

आपके उदाहरण के मामले में:

const values = Object["values"](data).map(x => x.substr(0, x.length - 4));

यह ts संकलक त्रुटि छिपाएगा।


1
आप प्रतिभाशाली हैं (^ - '') b
harufumi.abe

तत्व का स्पष्ट रूप से एक 'कोई' प्रकार है क्योंकि 'ObjectConstructor' का कोई सूचकांक हस्ताक्षर नहीं है। (7017)
Tyguy7

6
यह टीएस का गलत उपयोग है। आपको यह libनिर्धारित करने के लिए सेटिंग के साथ संकलक को कॉन्फ़िगर करना चाहिए कि आप इसका उपयोग कैसे कर रहे हैं, जानबूझकर संकलक से बच नहीं रहे हैं।
आरोन बेयेल

1
@AaronBeall यह एक अच्छा उपयोग है अगर किसी कारण से आप es2017 में अपग्रेड नहीं कर सकते हैं
डिनो

@ डिनो आपको es2017 में अपग्रेड करने की आवश्यकता नहीं है, आप ES5 के लिए सभी तरह से पॉलीफ़िल करने के लिए कोर-जेएस का उपयोग कर सकते हैं । टाइपस्क्रिप्ट में कोई रनटाइम नहीं है, libसेटिंग केवल सही प्रकार की जाँच करने के लिए है।
आरोन बाइलल

11

मैंने tsconfig.jsonटाइपस्क्रिप्ट में इस सुविधा को सक्षम करने के लिए अपने लक्ष्य में वृद्धि की है

{
    "compilerOptions": {
        "target": "es2017",
        ......
    }
}

यदि आप पुराने ब्राउज़रों के साथ अनुकूलता रखना चाहते हैं तो लक्ष्य को बदलना कोई समाधान नहीं है। टाइपस्क्रिप्ट को ES2015 के लिए ES2017 सिंटैक्स ट्रांसपाइल करने में सक्षम होना चाहिए।
रैंडम

4

मैं बस इस सटीक मुद्दे को एक पुस्तकालय का उपयोग करने के लिए बनाने के लिए सीएलआई और कार्यक्षेत्रों का उपयोग करते हुए कोणीय 6 के साथ मारा ng g library foo

मेरे मामले में मुद्दा tsconfig.lib.jsonलाइब्रेरी फ़ोल्डर में था जिसमें es2017शामिल नहीं थाlib अनुभाग ।

कोणीय 6 के साथ इस मुद्दे पर किसी को भी ठोकर खाने से आपको यह सुनिश्चित करने की आवश्यकता है कि आप tsconfig.lib.jsonअपने आवेदन के साथ-साथ आपको अपडेट करेंtsconfig.json


मैं दोनों tsconfig.lib और tsconfig.json में es2017 डाल दिया है, लेकिन फिर भी मुझे प्रविष्टियों का उपयोग करने की कोशिश करते समय त्रुटि 'ऑब्जेक्ट्स ऑब्जेक्ट पर मौजूद नहीं है' मिलती है। क्या कुछ और है जिसे मुझे बदलना चाहिए / अपडेट करना चाहिए?
मौरिस

मैंने अभी-अभी2017 में tsconfig.lib में लक्ष्य बदल दिया, अभी भी वही त्रुटि है।
मौरिस

2

मेरे होने tslintयहां नियमों विन्यास हमेशा लाइन की जगह Object["values"](myObject)के साथObject.values(myObject)

यदि आपके पास एक ही समस्या है तो दो विकल्प:

(Object as any).values(myObject)

या

/*tslint:disable:no-string-literal*/
`Object["values"](myObject)`

1
आप कभी क्यों इस्तेमाल करना चाहेंगे Object["values"]?
आरोन बेयेल

-4

सबसे आसान तरीका कास्ट करने के लिए है Objectकरने के लिए any, इस तरह:

const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"};
const obj = <any>Object;
const values = obj.values(data).map(x => x.substr(0, x.length - 4));
const commaJoinedValues = values.join(',');
console.log(commaJoinedValues);

और वोइला - कोई संकलन त्रुटियाँ नहीं;)


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