টাইপ স্ক্রিপ্ট সহ কীভাবে অবজেক্ট.ভ্যালু ব্যবহার করবেন?


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

পরিবর্তে অবজেক্ট.কিগুলি ব্যবহার করে।

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এর সংকলন ত্রুটি সমাধানের জন্য কীভাবে টিএস-তে ES7 ব্যবহার করতে হবে তার প্রকৃত উত্তর নয় । এটি করতে আপনার কেবল ES2017আপনার --libসেটিংয়ে প্রয়োজন ।
অ্যারন বেল

4
অ্যারন আপনার সমাধানটি এত জটিল যে টাইপস্ক্রিপ্টে নতুন যে কেউ গ্রহণ করতে পারে না, সংকলন করতে আপনাকে অবশ্যই ES2017লিবিব যুক্ত করতে হবে এবং পলিফিলস লাইব্রেরি অবশ্যই এতে অন্তর্ভুক্ত থাকতে হবে যেখানে বিভিন্ন লোকের বিরুদ্ধে বিভিন্ন উত্তর উত্তর যেমন রাজা।
হোলি-জাভা

9
@ হোলি-জাভে এটি "আমার সমাধান" নয় এটি ঠিক যেমন টিএস এবং অ-এখনও-মানক জেএস বৈশিষ্ট্যগুলি যেমন ওপি-র ব্যবহারের চেষ্টা করার মতো কাজ করে ES7/Object.values()। সম্ভবত আপনি এটি জটিল মনে করেন (আমি একমত নই) তবে এটি কেবল Object.values()আজকের মতো ভবিষ্যতের বৈশিষ্ট্যগুলি ব্যবহার করার চেষ্টা করার প্রকৃতি । এটি সর্বদা এইভাবে ছিল। এমনকি Object.keys()আপনি যদি ES3 টার্গেট করছেন বা IE8 সমর্থন করতে চান তবে এখনও পলিফিল্ড হওয়া উচিত (আশা করি আপনি আর করবেন না!) আপনি ওয়েব বিকাশে থাকলে ES বৈশিষ্ট্যগুলি, ব্রাউজার সমর্থন এবং পলিফিলিং বুঝতে সাধারণভাবে এটি ভাল ধারণা!
অ্যারন বেল

অ্যারোন আমাকে বলা হয় না যে এটি জটিল, তবে টাইপস্ক্রিপ্ট / জাভাস্ক্রিপ্টে নতুন কারও পক্ষে আরও জটিল এবং গ্রহণযোগ্য নয়।
হোলি-জাভা


224

Object.values()হয় ES2017 অংশ , এবং কারণ আপনার ES2017 গ্রন্থাগার ব্যবহার করতে কনফিগার হিজড়া প্রয়োজন কম্পাইল এরর আপনি পাচ্ছেন হয়। আপনি সম্ভবত আপনার বর্তমান টিএস কনফিগারেশনে ES6 বা ES5 লাইব্রেরি ব্যবহার করছেন।

সমাধান: ব্যবহার করুন es2017বা es2017.objectআপনার --libসংকলক বিকল্পে

উদাহরণস্বরূপ, ব্যবহার করে tsconfig.json:

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

নোট করুন যে টাইপস্ক্রিপ্টের সাথে ES2017 টার্গেট করা ES2017 এর জন্য ব্রাউজারে পলিফিলগুলি নির্গত করে না (এর অর্থ ওপরে আপনার সংকলন ত্রুটিটি সমাধান করে , তবে আপনি এখনও রানটাইম ত্রুটির মুখোমুখি হতে পারেন কারণ ব্রাউজার ES2017 বাস্তবায়ন করে না Object.values), আপনার প্রকল্পটি পলিফিল করা আপনার উপর নির্ভর করবে আপনি চাইলে কোড করুন যেহেতু Object.valuesএখনো ভাল সমস্ত ব্রাউজার দ্বারা সমর্থিত নয় (এই লেখার সময়) আপনি স্পষ্টভাবে একটি polyfill চাই: core-jsহবে কাজ


1
@ এরিকওয়ান ওয়েলজেন আপনি উত্তরটি সম্পাদনা করে কেস পরিবর্তন করতে ES2017চেয়েছিলেন es2017তবে এএফএইআইকি এটি প্রয়োজনীয় নয়, তবে আমি সবসময় শিখতে চাই, পরিবর্তনের কোনও কারণ ছিল কি?
অ্যারন বেল

2
^ আমার নিজের প্রশ্নের উত্তর করার জন্য: ES2017, DOM(বড় হাতের) এ তালিকাভুক্ত করা হয় tsc --initবৈধ মান যেমন মন্তব্য এবং এটি কম্পাইলার সঠিকভাবে কাজ করে, কিন্তু তাদেরকে JSON স্কিমা শুধুমাত্র উল্লেখ es2017, dom(ছোট হাতের) বিকল্প, তাই তাদেরকে JSON আইডিই / Linter ইচ্ছা পতাকা ES2017, DOMযেমন একটি অবৈধ মান (সেগুলি বৈধ হলেও)। কিছুটা বিভ্রান্তিকর।
অ্যারন বেল

আসলে কারণ ছিল। আপনি নোট হিসাবে এটি বড় হাতের কাজ করে। tsc --helpযদিও ছোট হাতের প্রদর্শন করে
এরিক ভ্যান ভেলজেন

কোর-জেএসগুলি কৌণিক অন্তর্ভুক্ত নয়, যদি না হয় তবে এই পলিফিলটি কীভাবে যুক্ত করবেন?
সামিউল্লাহ খান

1
@ Totty.js টিএস অন্তর্ভুক্ত লাইব্রেরি ফাইলগুলি কেবল টাইপ-পরীক্ষার জন্য , অন্য কথায় এটি আসলে কোনও জেএস লাইব্রেরি পলফিলকে পছন্দ মতো জিনিস নির্গত করে না Object.values()। অন্য কথায় আপনি সংকলন ত্রুটিটি পেতে পারেন তবে আপনি যদি নেই এমন একটি ব্রাউজারে চালান তবে রানটাইম ত্রুটিগুলিতে চলে যেতে পারেন Object.values()
অ্যারন বেল

18

আপনি ব্যবহার করতে পারেন Object.valuesএই করে টাইপ করা বিষয় মধ্যে (<any>Object).values(data)যদি কোনো কারণে আপনি tsconfig মধ্যে ES7 আপডেট করতে পারবেন না।


4
অ্যারন পোস্ট করার সময় সেখানে মন্তব্য ছিল যে ইঙ্গুলারের একটি নির্দিষ্ট সংস্করণ ব্যবহার করছে এমন লোকদের লিবটি যেখানে এটি কাজ করছে না সেখানে আপডেট করার ক্ষেত্রে সমস্যা ছিল। যে কারণেই আমি if for some reason you can't update to ES7 in tsconfig
রেখেছি

11

পরিবর্তে

Object.values(myObject);

ব্যবহার

Object["values"](myObject);

আপনার উদাহরণের ক্ষেত্রে:

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

এটি ts সংকলক ত্রুটিটি আড়াল করবে।


1
আপনি প্রতিভা (^ - ') বি
হারুফুমি.বেব

এলিমেন্টটির স্পষ্টতই একটি 'যে কোনও' টাইপ রয়েছে কারণ টাইপ 'অবজেক্ট কনস্ট্রাক্টর' এর কোনও সূচক স্বাক্ষর নেই। (7017)
টাইগুই

6
এটি টিএস-এর একটি ভুল ব্যবহার। আপনি libকীভাবে এটি ব্যবহার করছেন তা প্রতিফলিত করার জন্য আপনার এই সংকলনটি কনফিগার করা উচিত , ইচ্ছাকৃতভাবে সংকলকটি এড়ান না escape
অ্যারন বেল

1
@ অ্যারনবিল এটি খুব ভাল ব্যবহার যদি কোনও কারণে আপনি এস ২০১2017 এ আপগ্রেড করতে না পারেন
ডিনো

@ ডিনো আপনার এএস ২০১7 এ আপগ্রেড করার দরকার নেই, আপনি ES5-তে পুরোপুরি পলিফিল করতে কোর- জেএস ব্যবহার করতে পারেন । টাইপস্ক্রিপ্টের কোনও রানটাইম নেই, libসেটিংসটি সঠিক টাইপ-চেকিংয়ের জন্য।
অ্যারন বেল

11

tsconfig.jsonটাইপস্ক্রিপ্টে এই বৈশিষ্ট্যটি সক্ষম করতে আমি লক্ষ্য বাড়িয়েছি

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

আপনি যদি পুরানো ব্রাউজারগুলির সাথে সামঞ্জস্য রাখতে চান তবে লক্ষ্য পরিবর্তন করা কোনও সমাধান নয়। টাইপস্ক্রিপ্ট একটি ES2017 সিন্ট্যাক্স ES2015 এ স্থানান্তর করতে সক্ষম হতে হবে।
এলোমেলো

4

আমি এঙ্গুলার 6 এর সাথে সিএলআই এবং ওয়ার্কস্পেস ব্যবহার করে একটি লাইব্রেরি তৈরি করে কেবল এই সঠিক সমস্যাটি আঘাত করেছি ng g library foo

আমার ক্ষেত্রে বিষয়টি tsconfig.lib.jsonলাইব্রেরি ফোল্ডারে ছিল যা বিভাগটিতে es2017অন্তর্ভুক্ত ছিল না lib

অ্যাঙ্গুলার 6 দিয়ে এই সমস্যাটি নিয়ে যে কেউই হোঁচট খাচ্ছে আপনার কেবল tsconfig.lib.jsonআপনার অ্যাপ্লিকেশনটির পাশাপাশি আপনাকেও আপডেট করার বিষয়টি নিশ্চিত করতে হবেtsconfig.json


tsconfig.lib এবং tsconfig.json উভয়ই আমি es2017 রেখেছি, তবে তবুও আমি এন্ট্রি ব্যবহারের চেষ্টা করার সময় ত্রুটিটি 'অবজেক্টে উপস্থিত নেই' ত্রুটিটি পেয়েছি। আমার কিছু পরিবর্তন / আপডেট করা উচিত?
মরিস

আমি tsconfig.lib এ টার্গেটটি এখনই es2017 এ পরিবর্তন করেছি, এখনও একই ত্রুটি।
মরিস

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);

এবং ভয়েলা - কোনও সংকলনের ত্রুটি নেই;)


-4

এমনকি সরল, _.valuesআন্ডারস্কোর.জ থেকে https: //:30corejs.org/#values ব্যবহার করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.