টাইপস্ক্রিপ্ট রেকর্ড টাইপ কি?


182

Record<K, T>টাইপস্ক্রিপ্ট মানে কি ?

টাইপস্ক্রিপ্ট ২.১ Recordপ্রকারটি প্রবর্তন করেছিল , এটি একটি উদাহরণে বর্ণনা করে:

// For every properties K of type T, transform it to U
function mapObject<K extends string, T, U>(obj: Record<K, T>, f: (x: T) => U): Record<K, U>

দেখতে টাইপ করা বিষয় 2.1

আর উন্নত প্রকারভেদ পৃষ্ঠা উল্লেখ Recordম্যাপ করা পাশাপাশি শিরোনাম প্রকারভেদ অধীনে Readonly, Partialএবং Pick, কি এর সংজ্ঞা উপস্থিত হতে পারে মধ্যে:

type Record<K extends string, T> = {
    [P in K]: T;
}

কেবলমাত্র পঠনযোগ্য, আংশিক এবং বাছাই হোমোর্ফিক হয় যদিও রেকর্ডটি নেই। রেকর্ডটি হোমোর্ফিক নয় এমন একটি সূত্র হ'ল এটি থেকে বৈশিষ্ট্যগুলি অনুলিপি করতে কোনও ইনপুট টাইপ নেয় না:

type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>

এবং এটাই. উপরে কোট ছাড়া অন্য কোন উল্লেখ নেই Recordউপর typescriptlang.org

প্রশ্নাবলি

  1. কেউ কি একটি সাধারণ সংজ্ঞা দিতে পারেন Record?

  2. Record<K,T>কেবল "এই বস্তুর সমস্ত বৈশিষ্ট্যের ধরণ থাকবে" বলার উপায় কি T? সম্ভবত সমস্ত সম্পত্তি নয়, যেহেতু Kকিছু উদ্দেশ্য রয়েছে ...

  3. জেনেরিকগুলি সেই Kবস্তুটিতে নেই যা অতিরিক্ত কীগুলি নিষিদ্ধ করে K, বা এটি তাদের অনুমতি দেয় এবং কেবল তাদের বৈশিষ্ট্যগুলিতে রূপান্তরিত হয় না তা নির্দেশ করে T?

  4. প্রদত্ত উদাহরণ সহ:

     type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>

এটি কি ঠিক এর মতোই ?:

    type ThreeStringProps = {prop1: string, prop2: string, prop3: string}

6
৪. এর উত্তরটি বেশ "হ্যাঁ", যাতে সম্ভবত আপনার অন্যান্য প্রশ্নের উত্তর দেওয়া উচিত।
jcalz

উত্তর:


210
  1. কেউ কি একটি সাধারণ সংজ্ঞা দিতে পারেন Record?

একটি Record<K, T>একটি বস্তুর রযেছে যাদের সম্পত্তি কী হয় Kযার সম্পত্তি মান T। এটি, keyof Record<K, T>সমান K, এবং Record<K, T>[K](মূলত) সমতুল্য T

  1. Record<K,T>কেবল "এই বস্তুর সমস্ত বৈশিষ্ট্যের ধরণ থাকবে" বলার উপায় কি T? সম্ভবত সমস্ত বস্তু নয়, যেহেতু Kকিছু উদ্দেশ্য রয়েছে ...

আপনি যেমন নোট Kকরেছেন তেমন একটি উদ্দেশ্য রয়েছে ... সম্পত্তি কীগুলি নির্দিষ্ট মানগুলিতে সীমাবদ্ধ করা। আপনি যদি সমস্ত সম্ভাব্য স্ট্রিং-মূল্যবান কীগুলি গ্রহণ করতে চান তবে আপনি এর মতো কিছু করতে পারেন Record<string, T>, তবে এটি করার মূর্তিযুক্ত পদ্ধতিটি হল একটি সূচক স্বাক্ষরের মতো ব্যবহার করা { [k: string]: T }

  1. জেনেরিকগুলি সেই Kবস্তুটিতে নেই যা অতিরিক্ত কীগুলি নিষিদ্ধ করে K, বা এটি তাদের অনুমতি দেয় এবং কেবল তাদের বৈশিষ্ট্যগুলিতে রূপান্তরিত হয় না তা নির্দেশ করে T?

এটি অতিরিক্ত কীগুলি হুবহু "নিষেধ" করে না: সর্বোপরি, কোনও মানের সাধারণত বৈশিষ্ট্যগুলি ধরণের হিসাবে উল্লেখ করা যায় না এমন অনুমতি দেওয়া হয় ... তবে এটি স্বীকৃতি দেয় না যে এই জাতীয় বৈশিষ্ট্যগুলি বিদ্যমান:

declare const x: Record<"a", string>;
x.b; // error, Property 'b' does not exist on type 'Record<"a", string>'

এবং এটি তাদের অতিরিক্ত সম্পত্তি হিসাবে বিবেচনা করবে যা কখনও কখনও প্রত্যাখ্যাত হয়:

declare function acceptR(x: Record<"a", string>): void;
acceptR({a: "hey", b: "you"}); // error, Object literal may only specify known properties

এবং কখনও কখনও গৃহীত:

const y = {a: "hey", b: "you"};
acceptR(y); // okay
  1. প্রদত্ত উদাহরণ সহ:

    type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>

    এটি কি ঠিক এর মতোই ?:

    type ThreeStringProps = {prop1: string, prop2: string, prop3: string}

হ্যাঁ!

আশা করি এইটি কাজ করবে. শুভকামনা!


1
খুব শিখেছে এবং একটি প্রশ্ন কেন "এমনটি করার বুদ্ধিমান পদ্ধতিটি কোনও সূচক স্বাক্ষর ব্যবহার করা" রেকর্ড নয়? এই "প্রতিচ্ছবি" সম্পর্কে কোনও সম্পর্কিত তথ্য আমি পাই না।
কিংবদন্তি 80s

2
আপনি চান Record<string, V>তা বোঝাতে ব্যবহার {[x: string]: V}করতে পারেন; আমি সম্ভবত এটি নিজেও করেছি। সূচীর স্বাক্ষর সংস্করণটি আরও সরাসরি: এটি একই ধরণের, তবে পূর্ববর্তীটি হ'ল একটি ম্যাপযুক্ত প্রকারের একটি প্রকারের উপনাম যা সূচক স্বাক্ষরের মূল্যায়ন করে, তবে পরবর্তীটি সরাসরি সূচক স্বাক্ষর। অন্য সব সমান হচ্ছে, আমি পরবর্তীগুলির সুপারিশ করব। একইভাবে আমি অন্য কোনও বাধ্যতামূলক প্রাসঙ্গিক কারণ না করে থাকলে তার Record<"a", string>জায়গায় আমি ব্যবহার {a: string}করব না।
jcalz

1
" অন্য সব কিছু সমান হওয়ায়, আমি পরবর্তীগুলির সুপারিশ করব " "কেন এটি? আমার প্রাক-টাইপসক্রিপ্টটি স্বীকার করে, তবে আমি জানি যে পূর্ববর্তীটি সি # পার্শ্ব থেকে আগত লোকদের জন্য স্ব-মন্তব্য করবে, এবং জাভাস্ক্রিপ্ট-থেকে-টাইপ-স্ক্রিপ্টারের জন্য খারাপ নয়। আপনি কি কেবল এইগুলি নির্মাণের জন্য প্রতিস্থাপনের পদক্ষেপ এড়িয়ে যেতে আগ্রহী?
ruffin

1
কেবলমাত্র আমার অভিমত: Record<string, V>আপনি যদি ইতিমধ্যে জেনে থাকেন যে কীভাবে সূচি স্বাক্ষরগুলি টাইপস্ক্রিপ্টে কাজ করে। উদাহরণস্বরূপ, প্রদত্ত x: Record<string, string>, x.fooসম্ভবত একটি stringসংকলন সময় হবে, কিন্তু বাস্তবে সম্ভবত এটি হতে পারে string | undefined। এটি কীভাবে --strictNullChecksকাজ করে তার একটি ফাঁক (দেখুন # 13778 )। আমি বরং আগন্তুকদের সূচি স্বাক্ষরের আচরণের মাধ্যমে {[x: string]: V}চেইনটি অনুসরণ করার আশা করার পরিবর্তে সরাসরি মোকাবেলা করতে চাই । Record<string, V>{[P in string]: V}
jcalz

আমি এটি উল্লেখ করতে চেয়েছিলাম যে যৌক্তিকভাবে কোনও প্রকারকে টাইপের মধ্যে থাকা সমস্ত মানের একটি সেট হিসাবে সংজ্ঞায়িত করা যায়। এই ব্যাখ্যাটি প্রদান করে আমি মনে করি রেকর্ড <স্ট্রিং, ভি> সমস্ত সম্ভাব্য মান রাখার পরিবর্তে কোডটি সহজ করার জন্য একটি বিমূর্ততা হিসাবে যুক্তিসঙ্গত। এটি ইউটিলিটি ধরণের ডকুমেন্টেশনের উদাহরণের মতো: রেকর্ড <টি, ভি> যেখানে T = 'a' টাইপ করুন 'খ' | 'গ'। কখনই রেকর্ড <'এ', স্ট্রিং> করা ভাল কোনও পাল্টা উদাহরণ নয়, কারণ এটি একই ধাঁচ অনুসরণ করে না। এটি অন্যান্য উদাহরণগুলির মতো বিমূর্ততার মাধ্যমে কোডটি পুনরায় ব্যবহার বা সরল করতে যোগ করে না।
স্কট লিওনার্ড

68

একটি রেকর্ড আপনাকে ইউনিয়ন থেকে একটি নতুন ধরণের তৈরি করতে দেয়। ইউনিয়নের মানগুলি নতুন ধরণের বৈশিষ্ট্য হিসাবে ব্যবহৃত হয়।

উদাহরণস্বরূপ, বলুন আমার এর মতো ইউনিয়ন রয়েছে:

type CatNames = "miffy" | "boris" | "mordred";

এখন আমি এমন একটি বস্তু তৈরি করতে চাই যাতে সমস্ত বিড়ালদের সম্পর্কে তথ্য থাকে, আমি ক্যাটনেম ইউনিয়নের মানগুলি কী হিসাবে ব্যবহার করে একটি নতুন ধরণ তৈরি করতে পারি।

type CatList = Record<CatNames, {age: number}>

আমি যদি এই ক্যাটলিস্টটি সন্তুষ্ট করতে চাই তবে আমাকে অবশ্যই এই জাতীয় একটি বিষয় তৈরি করতে হবে:

const cats:CatList = {
  miffy: { age:99 },
  boris: { age:16 },
  mordred: { age:600 }
}

আপনি খুব শক্তিশালী ধরণের সুরক্ষা পান:

  • আমি যদি একটি বিড়ালকে ভুলে যাই তবে আমি একটি ত্রুটি পাই।
  • যদি আমি এমন একটি বিড়াল যুক্ত করি যা অনুমোদিত নয় তবে আমি একটি ত্রুটি পেয়েছি।
  • আমি যদি পরে ক্যাটনামগুলি পরিবর্তন করি তবে আমি একটি ত্রুটি পাই। এটি বিশেষত দরকারী কারণ ক্যাটনামস সম্ভবত অন্য ফাইল থেকে আমদানি করা হয়েছে এবং সম্ভবত এটি অনেক জায়গায় ব্যবহার করা হয়েছে।

বাস্তব-বিশ্বের প্রতিক্রিয়া উদাহরণ।

আমি সম্প্রতি একটি স্ট্যাটাস উপাদান তৈরি করতে এটি ব্যবহার করেছি। উপাদানটি একটি স্ট্যাটাস প্রোপ গ্রহণ করবে এবং তারপরে একটি আইকন রেন্ডার করবে। উদাহরণস্বরূপ উদ্দেশ্যে আমি কোডটি এখানে বেশ সরলকরণ করেছি

আমার এই মত ইউনিয়ন ছিল:

type Statuses = "failed" | "complete";

আমি এটির মতো একটি বিষয় তৈরি করতে এটি ব্যবহার করেছি:

const icons: Record<
  Statuses,
  { iconType: IconTypes; iconColor: IconColors }
> = {
  failed: {
    iconType: "warning",
    iconColor: "red"
  },
  complete: {
    iconType: "check",
    iconColor: "green"
  };

আমি তখন অবজেক্ট থেকে প্রপসগুলিতে কোনও উপাদান ধ্বংস করে রেন্ডার করতে পারি:

const Status = ({status}) => <Icon {...icons[status]} />

যদি স্ট্যাটাস ইউনিয়ন পরে প্রসারিত বা পরিবর্তিত হয় তবে আমি জানি আমার স্থিতি উপাদানটি সংকলন করতে ব্যর্থ হবে এবং আমি ত্রুটি পেয়ে যাব যা আমি তাৎক্ষণিকভাবে ঠিক করতে পারি। এটি আমাকে অ্যাপটিতে অতিরিক্ত ত্রুটি যুক্ত করার অনুমতি দেয়।

নোট করুন যে আসল অ্যাপটিতে কয়েক ডজন ত্রুটিযুক্ত অবস্থা রয়েছে যা একাধিক জায়গায় রেফারেন্স করা হয়েছিল, সুতরাং এই ধরণের সুরক্ষা অত্যন্ত কার্যকর ছিল।


আমি ধরে নিই যে বেশিরভাগ সময় type Statusesবেঁচে থাকে আপনার দ্বারা সংজ্ঞায়িত হয় না? অন্যথায় আমি এনামের সাথে একটি ইন্টারফেসের মতো কিছু দেখতে পাচ্ছি যা আরও ভাল ফিট আছে?
ভিক্টোরিও বেরেরা

হাই @ ভিক্টোরিও, আমি নিশ্চিত নই যে কোনও এনাম কীভাবে সমস্যার সমাধান করবে, আপনি যদি কোনও কীটি মিস করেন তবে এনামে ত্রুটি পাবেন না। এটি কী এবং মানগুলির মধ্যে কেবল একটি ম্যাপিং।
সুপারলুমিনিয়ার

1
আমি এখন আপনি কি বলতে চাইছেন। সি # থেকে আগত আমাদের এটি করার মতো চতুর উপায় নেই। নিকটতম জিনিসটির অভিধান হবে Dictionary<enum, additional_metadata>। রেকর্ড টাইপটি সেই এনাম + মেটাডেটা প্যাটার্ন উপস্থাপনের দুর্দান্ত উপায়।
ভিক্টোরিও বেরেরা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.