প্রকার থেকে সম্পত্তি বাদ দিন


158

আমি টাইপ থেকে একক সম্পত্তি বাদ দিতে চাই। আমি এটা কিভাবে করবো?

যেমন আমার আছে

interface XYZ {
  x: number;
  y: number;
  z: number;
}

এবং আমি সম্পত্তি zপেতে বাদ দিতে চাই

type XY = { x: number, y: number };

উত্তর:


335

টাইপস্ক্রিপ্টের সংস্করণগুলির জন্য 3.5 বা তার বেশি

টাইপস্ক্রিপ্ট ৩.৫-এ, Omitপ্রকারটি পাঠাগারে যুক্ত করা হয়েছিল। এটি কীভাবে ব্যবহার করতে হয় তার জন্য নীচের উদাহরণগুলি দেখুন।

টাইপস্ক্রিপ্ট সংস্করণের জন্য 3.5

টাইপস্ক্রিপ্ট ২.৮-তে, Excludeপ্রকারটি পাঠাগারে স্ট্যান্ডার্ড লাইব্রেরিতে যুক্ত করা হয়েছিল, যা একটি বাদ পড়ার প্রকারটি কেবল এইভাবে লেখা যায়:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

২.৮ এর নিচে টাইপস্ক্রিপ্টের সংস্করণগুলির জন্য

আপনি Exclude২.৮ এর নীচের সংস্করণগুলিতে প্রকারটি ব্যবহার করতে পারবেন না , তবে উপরের মত একই ধরণের সংজ্ঞা ব্যবহার করতে আপনি এর জন্য একটি প্রতিস্থাপন তৈরি করতে পারেন। তবে, এই প্রতিস্থাপনটি কেবল স্ট্রিং প্রকারের জন্য কাজ করবে, সুতরাং এটি ততটা শক্তিশালী নয় Exclude

// Functionally the same as Exclude, but for strings only.
type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T]
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>

এবং এই ধরণের ব্যবহারের একটি উদাহরণ:

interface Test {
    a: string;
    b: number;
    c: boolean;
}

// Omit a single property:
type OmitA = Omit<Test, "a">; // Equivalent to: {b: number, c: boolean}

// Or, to omit multiple properties:
type OmitAB = Omit<Test, "a"|"b">; // Equivalent to: {c: boolean}

গ্রেট! আপনি ঘোষণা করা হয় Diff<T, U>(সঙ্গে Tএবং Uকী জন্য উপলব্ধ ধরনের হিসাবে) হিসেবে Tএকটি জন্য মান হিসাবে কী একই টাইপ: 3 ধরনের একটি ছেদ -keyed উপসেট Tসঙ্গে টাইপ neverজন্য Uএবং টাইপ neverসমস্ত কী জন্য। তারপরে সঠিক মানের ধরণ পেতে আপনি সূচকের মাধ্যমে এটি পাস করুন। আমি কি সঠিক?
কিওয়ারটি

5
হাঁ! তবে এর একটি অসুবিধা আছে। উদাহরণস্বরূপ, Omit<{a?: string, b?: boolean}, "b">ফলাফলগুলি {a: string | undefined}, যা এখনও undefinedমান হিসাবে গ্রহণ করে তবে optionচ্ছিক পরিবর্তকটি হারায় a। :(
ক্রিস

দুঃখের বিষয় .. ঘোষিত ও ছড়িয়ে দেওয়ার মতো আকর্ষণীয় উপায় alচ্ছিক সংশোধক রাখে ... এটি রাখার কোনও অন্য উপায় আছে কি?
কিওয়ারটি

1
@ কিওয়ারটি এটি কাজ করে! অনেক ধন্যবাদ! আমি পোস্টটি সম্পাদনা করেছি। তবে আমি আশ্চর্য হয়েছি কি পার্থক্য ছিল, যেহেতু যা ছিল তা টাইপ সংজ্ঞার সাথে আক্ষরিকভাবে একই রকম ছিল যেখানে Pickআমি দেখতে পাচ্ছি।
ক্রিস

3
নোট করুন যে টিএস ৩.৫ এর জন্য, স্ট্যান্ডার্ড লাইব্রেরির সংজ্ঞা Omitএখানে দেওয়া থেকে পৃথক। স্টাডলিবে এটি type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;পরিবর্তন, যদিও সামান্য কিছুটা বিতর্ক সৃষ্টি করেছে তাই পার্থক্য সম্পর্কে সচেতন হন।
ক্রিস

41

টাইপস্ক্রিপ্ট ২.৮ সহ, আপনি নতুন অন্তর্নির্মিত Excludeপ্রকারটি ব্যবহার করতে পারেন । 2.8 রিলিজ নোট আসলে অধ্যায় "পূর্বনির্ধারিত শর্তসাপেক্ষ ধরনের" এ এই উল্লেখ:

দ্রষ্টব্য: বাদ দেওয়া প্রকারটি এখানে প্রস্তাবিত ডিফ টাইপের একটি যথাযথ বাস্তবায়ন। [...] ওমিট প্রকারটি আমরা অন্তর্ভুক্ত করি নি কারণ এটি তুচ্ছ হিসাবে লেখা হয়েছে Pick<T, Exclude<keyof T, K>>

আপনার উদাহরণটিতে এটি প্রয়োগ করে, এক্সওয়াই টাইপটিকে সংজ্ঞায়িত করা যেতে পারে:

type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>

19

আমি কিছু ভেরিয়েবল ঘোষণার এবং স্প্রেড অপারেটর ব্যবহার করে অনুমানের ধরণের সমাধান খুঁজে পেয়েছি :

interface XYZ {
  x: number;
  y: number;
  z: number;
}

declare var { z, ...xy }: XYZ;

type XY = typeof xy; // { x: number; y: number; }

এটি কাজ করে, তবে এর থেকে আরও ভাল সমাধান দেখে আমি আনন্দিত হব।


3
এটি একটি দুর্দান্ত প্রাক-2.8 সমাধান। typeofটাইপ স্ক্রিপ্টের আরও অনাকাঙ্ক্ষিত বৈশিষ্ট্যগুলির মধ্যে একটি।
জেসন হেটগার

1
চতুর, আমি এটা পছন্দ :)! (প্রাক 2.8 এর জন্য)
ম্যাক্সিমিম 1992

আমি কীভাবে আপনার
ফলাফলটিতে

@ ব্যবহারকারী 602291 type Smth = XY & { z: string };,?
কিওয়ারটি

1
এই এক টাইপস্ক্রিপ্ট পুরানো সংস্করণ জন্য নিখুঁত। আমি ২.৩-এর জন্য কাজের উত্তর অর্জন করতে পারিনি, তবুও এটি দুর্দান্ত কাজ করেছে।
k0pernikus

6

আপনি যদি কোনও লাইব্রেরি ব্যবহার করতে পছন্দ করেন তবে টিএস-প্রয়োজনীয় ব্যবহার করুন ।

import { Omit } from "ts-essentials";

type ComplexObject = {
  simple: number;
  nested: {
    a: string;
    array: [{ bar: number }];
  };
};

type SimplifiedComplexObject = Omit<ComplexObject, "nested">;

// Result:
// {
//  simple: number
// }

// if you want to Omit multiple properties just use union type:
type SimplifiedComplexObject = Omit<ComplexObject, "nested" | "simple">;

// Result:
// { } (empty type)

PS: আপনি সেখানে প্রচুর অন্যান্য দরকারী স্টাফ পাবেন;)


5

প্রকারভেদ 3.5

টাইপসক্রিপ্ট 3.5 হিসাবে, ওমিট সহায়কটি অন্তর্ভুক্ত করা হবে: টাইপস্ক্রিপ্ট ৩.৫ আরসি - ওমিট সহায়ক সাহায্যকারী প্রকার

আপনি এটি সরাসরি ব্যবহার করতে পারেন এবং আপডেট করার সময় আপনার ওমিট সহায়কের নিজস্ব সংজ্ঞাটি মুছে ফেলা উচিত।



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