تایپ های شرطی در تایپ اسکریپت با Infer
اگر با TypeScript کار کرده باشید، احتمالاً میدانید که این زبان قابلیتهای زیادی برای کار با تایپها ارائه میدهد. یکی از این قابلیتهای پیشرفته که ممکن است کمتر با آن آشنا باشید، کلمه کلیدی infer است. در این مقاله، به بررسی دقیق infer و کاربردهای آن میپردازیم. کلمه کلیدی infer در TypeScript در واقع بخشی از تایپهای شرطی است که به شما اجازه میدهد تایپها را از درون ساختارهای پیچیده استنتاج کنید. با استفاده از infer، میتوانید بخشهایی از یک تایپ را استخراج کرده و بهصورت تایپ جدیدی تعریف کنید. برای استفاده از infer، معمولاً باید یک تایپ شرطی بنویسید. بهطور کلی، ساختار پایه به این صورت است:
type Conditional<Type> = Type extends SomeType<infer U> ? U : never;
در این مثال:
Type ورودی تایپ شرطی است. SomeType یک ساختار تایپی است که میخواهید بخشی از آن را استخراج کنید. infer U به TypeScript میگوید که تایپ داخلی (یا بخشی از تایپ) را استنتاج کرده و آن را در متغیری به نام U ذخیره کند. اگر شرط برقرار باشد، U برگردانده میشود؛ در غیر این صورت، تایپ never استفاده میشود. فرض کنید میخواهید نوع آرگومان اولین ورودی یک تابع را استخراج کنید. برای این کار میتوانید از infer استفاده کنید:
type FirstArgument<T> = T extends (arg: infer A, ...args: any[]) => any ? A : never;type Fn = (x: string, y: number) => void;type Arg = FirstArgument<Fn>;
در اینجا: اگر T یک تایپ تابع باشد، infer A نوع اولین آرگومان را استنتاج میکند. اگر T تابع نباشد، نتیجه never خواهد بود. حالا بیایید نوع مقدار بازگشتی یک تابع را استخراج کنیم:
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;type Fn = () => Promise<number>;type Result = ReturnType<Fn>;
در این مثال:
infer R نوع مقدار بازگشتی تابع را استنتاج میکند. در صورت عدم تطابق با ساختار تابع، نتیجه never خواهد بود. فرض کنید یک آرایه دارید و میخواهید نوع عناصر آن را پیدا کنید. در اینجا infer به کار میآید:
type ElementType<T> = T extends (infer E)[] ? E : never;type Numbers = number[];type Element = ElementType<Numbers>;