۶ روش برای استفاده از Extract در تایپ اسکریپت

همانند مقاله‌ای که درمورد Exclude داشتیم، در این مقاله هم قصد داریم تا مجموعه‌ای از موارد استفاده برای یکی از مفیدترین مفاهیم موجود در تایپ اسکریپت، یعنی Extract را باهم بررسی کنیم.

استخراج یک عضو discriminated union توسط discriminator

با توجه به discriminated union، مانند

Event
Eventزیر، اغلب باید بتوانیم به یک عضو union دسترسی داشته باشیم.

این موضوع می‌تواند مانند یک مشکل مبهم احساس شود، تا زمانی که متوجه شویم که Extract یک ابزار عالی برای این کار در تایپ اسکریپت است. در مثالی که داریم، ما تایپ

ClickEvent
ClickEventرا از
Event
Eventاستخراج می‌کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type Event =
| {
type: "click";
x: number;
y: number;
}
| {
type: "focus";
}
| {
type: "blur";
};
type ClickEvent = Extract<Event, { type: "click" }>;
type ClickEvent = {
type: "click";
x: number;
y: number;
}
type Event = | { type: "click"; x: number; y: number; } | { type: "focus"; } | { type: "blur"; }; type ClickEvent = Extract<Event, { type: "click" }>; type ClickEvent = { type: "click"; x: number; y: number; }
type Event =
  | {
      type: "click";
      x: number;
      y: number;
    }
  | {
      type: "focus";
    }
  | {
      type: "blur";
    };
 
type ClickEvent = Extract<Event, { type: "click" }>;
         
type ClickEvent = {
    type: "click";
    x: number;
    y: number;
}

Event
Eventرا به عنوان آرگومان اول به
Extract
Extractمی‌دهیم و سپس شکل عضوی را که می‌خواهیم استخراج کنیم به عنوان آرگومان دوم ارسال می‌کنیم. مهم‌تر از همه این است که ما نیازی به انتقال کل عضو به
Extract
Extractنداریم، فقط شکلی را که می‌خواهیم مطابقت دهیم را ارسال می‌کنیم.

استخراج یک عضو discriminated union توسط shape

گاهی اوقات، می‌خواهیم یک عضو خاص از یک discriminated union را بر اساس شکل آن استخراج کنیم، نه discriminator آن. به تایپ

Event
Eventخود که قبلاً تعریف کردیم برمی‌گردیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type Event =
| {
type: "mousedown";
x: number;
y: number;
}
| {
type: "mouseup";
x: number;
y: number;
}
| {
type: "blur";
};
type Event = | { type: "mousedown"; x: number; y: number; } | { type: "mouseup"; x: number; y: number; } | { type: "blur"; };
type Event =
  | {
      type: "mousedown";
      x: number;
      y: number;
    }
  | {
      type: "mouseup";
      x: number;
      y: number;
    }
  | {
      type: "blur";
    };

به جای استخراج یک عضو بر اساس discriminator آن، فرض کنید می‌خواهیم عضوی را استخراج کنیم که دارای ویژگی

x
xاز تایپ
number
numberاست. می‌توانیم
{ x: number }
{ x: number }را به‌عنوان شکلی برای مطابقت ارائه کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type ClickEvent = Extract<Event, { x: number }>;
type ClickEvent = {
type: "mousedown";
x: number;
y: number;
} | {
type: "mouseup";
x: number;
y: number;
}
type ClickEvent = Extract<Event, { x: number }>; type ClickEvent = { type: "mousedown"; x: number; y: number; } | { type: "mouseup"; x: number; y: number; }
type ClickEvent = Extract<Event, { x: number }>;
         
type ClickEvent = {
    type: "mousedown";
    x: number;
    y: number;
} | {
    type: "mouseup";
    x: number;
    y: number;
}

نتیجه تایپ

ClickEvent
ClickEventاست، که عضوی از
Event
Eventunion می‌باشد و ویژگی
x
xاز تایپ
number
numberرا دارد. در این حالت، از آنجایی که هر دو عضو
mousedown
mousedownو
mouseup
mouseupدارای ویژگی
x
xهستند، تایپ
ClickEvent
ClickEventترکیبی از این دو عضو خواهد بود.

استخراج همه strings/booleans/numbers از یک union

یک تایپ union را در نظر می‌گیریم که شامل ترکیبی از stringها، booleanها و numberها است:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type PossibleValues =
| "admin"
| "user"
| "guest"
| true
| false
| ۱
| ۲
| ۳;
type PossibleValues = | "admin" | "user" | "guest" | true | false | ۱ | ۲ | ۳;
type PossibleValues =
  | "admin"
  | "user"
  | "guest"
  | true
  | false
  | ۱
  | ۲
  | ۳;

برای استخراج تمام اعضای string از این union، می‌توانیم از

Extract<PossibleValues, string>
Extract<PossibleValues, string>استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type Strings = Extract<PossibleValues, string>;
type Strings = "admin" | "user" | "guest"
type Strings = Extract<PossibleValues, string>; type Strings = "admin" | "user" | "guest"
type Strings = Extract<PossibleValues, string>;
       
type Strings = "admin" | "user" | "guest"

نتیجه، تایپ

Strings
Stringsخواهد بود که unionای از همه اعضای string (“admin”، “user” و “guest”) در
PossibleValues
PossibleValuesunion است.

استخراج تمام توابع از یک union

یک تایپ union را در نظر می‌گیریم که شامل ترکیبی از stringها، booleanها، numberها و توابع است:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type PossibleValues =
| string
| number
| boolean
| (() => void);
type PossibleValues = | string | number | boolean | (() => void);
type PossibleValues =
  | string
  | number
  | boolean
  | (() => void);

برای استخراج همه اعضای تابع از این union، می‌توانیم از

Extract<PossibleValues, (...args: any[]) => any>
Extract<PossibleValues, (...args: any[]) => any>استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type Functions = Extract<
type Functions = () => void
PossibleValues,
(...args: any[]) => any
>;
type Functions = Extract< type Functions = () => void PossibleValues, (...args: any[]) => any >;
type Functions = Extract<
        
type Functions = () => void
  PossibleValues,
  (...args: any[]) => any
>;

(...args: any[]) => any
(...args: any[]) => anyبه طور موثر با هر نوع تابع مطابقت دارد، بنابراین ما می‌توانیم از آن برای استخراج همه اعضای تابع از union استفاده کنیم.

در این حالت، تایپ

Functions
Functionsفقط شامل تایپ تابع
() => void
() => voidخواهد بود.

حذف null و undefined از یک union

مواقعی وجود دارد که می‌خواهیم تایپ‌های خاصی را از یک union حذف کنیم. ممکن است یک تایپ union داشته باشیم که شامل

null
nullو
undefined
undefinedباشد، اما بخواهیم تایپ جدیدی ایجاد کنیم که آن مقادیر را حذف کند.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type PossibleValues =
| string
| number
| boolean
| null
| undefined;
type PossibleValues = | string | number | boolean | null | undefined;
type PossibleValues =
  | string
  | number
  | boolean
  | null
  | undefined;

برای حذف

null
nullو
undefined
undefinedاز
PossibleValues
PossibleValues، می‌توانیم از
Extract<PossibleValues, {}>
Extract<PossibleValues, {}>استفاده کنیم.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type NotNull = Extract<PossibleValues, {}>;
type NotNull = string | number | boolean
type NotNull = Extract<PossibleValues, {}>; type NotNull = string | number | boolean
type NotNull = Extract<PossibleValues, {}>;
       
type NotNull = string | number | boolean

می‌توانیم از

{}
{}به‌عنوان آرگومان دوم برای
Extract
Extractبرای مطابقت با تایپ‌های EXCEPT برای
null
nullو
undefined
undefinedاستفاده کنیم. در این مقاله به شکل کامل تایپ empty object در تایپ اسکریپت را مورد بررسی قرار داده‌ایم.

یافتن اعضای مشترک بین دو union

در مثال زیر، ما دو نوع union داریم،

EnglishSpeakingCountries
EnglishSpeakingCountriesو
CountriesInWesternHemisphere
CountriesInWesternHemisphere:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type EnglishSpeakingCountries = "UK" | "USA" | "Canada";
type CountriesInWesternHemisphere =
| "USA"
| "Canada"
| "Mexico";
type EnglishSpeakingCountries = "UK" | "USA" | "Canada"; type CountriesInWesternHemisphere = | "USA" | "Canada" | "Mexico";
type EnglishSpeakingCountries = "UK" | "USA" | "Canada";
type CountriesInWesternHemisphere =
  | "USA"
  | "Canada"
  | "Mexico";

برای یافتن کشورهای مشترک بین این دو union، می‌توانیم از تایپ

Extract
Extractutility به صورت زیر استفاده کنیم:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
type CommonCountries = Extract<
type CommonCountries = "USA" | "Canada"
EnglishSpeakingCountries,
CountriesInWesternHemisphere
>;
type CommonCountries = Extract< type CommonCountries = "USA" | "Canada" EnglishSpeakingCountries, CountriesInWesternHemisphere >;
type CommonCountries = Extract<
           
type CommonCountries = "USA" | "Canada"
  EnglishSpeakingCountries,
  CountriesInWesternHemisphere
>;

تایپ

CommonCountries
CommonCountriesحاصل فقط شامل اعضایی خواهد بود که در هر دو union حضور دارند. در این مثال، کشور مشترک “USA” است که در هر دو union وجود دارد.

دیدگاه‌ها:

افزودن دیدگاه جدید