همانند مقالهای که درمورد Exclude داشتیم، در این مقاله هم قصد داریم تا مجموعهای از موارد استفاده برای یکی از مفیدترین مفاهیم موجود در تایپ اسکریپت، یعنی Extract را باهم بررسی کنیم.
با توجه به discriminated union، مانند Eventزیر، اغلب باید بتوانیم به یک عضو union دسترسی داشته باشیم.
این موضوع میتواند مانند یک مشکل مبهم احساس شود، تا زمانی که متوجه شویم که Extract یک ابزار عالی برای این کار در تایپ اسکریپت است. در مثالی که داریم، ما تایپ ClickEventرا از Eventاستخراج میکنیم:
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را به عنوان آرگومان اول به Extractمیدهیم و سپس شکل عضوی را که میخواهیم استخراج کنیم به عنوان آرگومان دوم ارسال میکنیم. مهمتر از همه این است که ما نیازی به انتقال کل عضو به Extractنداریم، فقط شکلی را که میخواهیم مطابقت دهیم را ارسال میکنیم.
گاهی اوقات، میخواهیم یک عضو خاص از یک discriminated union را بر اساس شکل آن استخراج کنیم، نه discriminator آن. به تایپ Eventخود که قبلاً تعریف کردیم برمیگردیم:
type Event =
| {
type: "mousedown";
x: number;
y: number;
}
| {
type: "mouseup";
x: number;
y: number;
}
| {
type: "blur";
};
به جای استخراج یک عضو بر اساس discriminator آن، فرض کنید میخواهیم عضوی را استخراج کنیم که دارای ویژگی xاز تایپ numberاست. میتوانیم { x: number }را بهعنوان شکلی برای مطابقت ارائه کنیم:
type ClickEvent = Extract<Event, { x: number }>;
type ClickEvent = {
type: "mousedown";
x: number;
y: number;
} | {
type: "mouseup";
x: number;
y: number;
}
نتیجه تایپ ClickEventاست، که عضوی از Eventunion میباشد و ویژگی xاز تایپ numberرا دارد. در این حالت، از آنجایی که هر دو عضو mousedownو mouseupدارای ویژگی xهستند، تایپ ClickEventترکیبی از این دو عضو خواهد بود.
یک تایپ union را در نظر میگیریم که شامل ترکیبی از stringها، booleanها و numberها است:
type PossibleValues = | "admin" | "user" | "guest" | true | false | 1 | 2 | 3;
برای استخراج تمام اعضای string از این union، میتوانیم از Extract<PossibleValues, string>استفاده کنیم:
type Strings = Extract<PossibleValues, string>;
type Strings = "admin" | "user" | "guest"
نتیجه، تایپ Stringsخواهد بود که unionای از همه اعضای string (“admin”، “user” و “guest”) در PossibleValuesunion است.
یک تایپ union را در نظر میگیریم که شامل ترکیبی از stringها، booleanها، numberها و توابع است:
type PossibleValues = | string | number | boolean | (() => void);
برای استخراج همه اعضای تابع از این union، میتوانیم از Extract<PossibleValues, (...args: any[]) => any>استفاده کنیم:
type Functions = Extract<
type Functions = () => void
PossibleValues,
(...args: any[]) => any
>;
(...args: any[]) => anyبه طور موثر با هر نوع تابع مطابقت دارد، بنابراین ما میتوانیم از آن برای استخراج همه اعضای تابع از union استفاده کنیم.
در این حالت، تایپ Functionsفقط شامل تایپ تابع () => voidخواهد بود.
مواقعی وجود دارد که میخواهیم تایپهای خاصی را از یک union حذف کنیم. ممکن است یک تایپ union داشته باشیم که شامل nullو undefinedباشد، اما بخواهیم تایپ جدیدی ایجاد کنیم که آن مقادیر را حذف کند.
type PossibleValues = | string | number | boolean | null | undefined;
برای حذف nullو undefinedاز PossibleValues، میتوانیم از Extract<PossibleValues, {}>استفاده کنیم.
type NotNull = Extract<PossibleValues, {}>;
type NotNull = string | number | boolean
میتوانیم از {}بهعنوان آرگومان دوم برای Extractبرای مطابقت با تایپهای EXCEPT برای nullو undefinedاستفاده کنیم. در این مقاله به شکل کامل تایپ empty object در تایپ اسکریپت را مورد بررسی قرار دادهایم.
در مثال زیر، ما دو نوع union داریم، EnglishSpeakingCountriesو CountriesInWesternHemisphere:
type EnglishSpeakingCountries = "UK" | "USA" | "Canada"; type CountriesInWesternHemisphere = | "USA" | "Canada" | "Mexico";
برای یافتن کشورهای مشترک بین این دو union، میتوانیم از تایپ Extractutility به صورت زیر استفاده کنیم:
type CommonCountries = Extract<
type CommonCountries = "USA" | "Canada"
EnglishSpeakingCountries,
CountriesInWesternHemisphere
>;
تایپ CommonCountriesحاصل فقط شامل اعضایی خواهد بود که در هر دو union حضور دارند. در این مثال، کشور مشترک “USA” است که در هر دو union وجود دارد.
دیدگاهها: