قابلیت Function Overloading در تایپ اسکریپت
فرض کنید یک تابع به نام calculate دارید که باید دو نوع ورودی را پشتیبانی کند:
اگر ورودی یک عدد باشد، مقدار آن را دو برابر کند. اگر ورودی یک رشته باشد، آن را به عدد تبدیل کرده، دو برابر کند و نتیجه را به صورت رشته بازگرداند.
function calculate(input: number | string): number | string { if (typeof input === "number") { return input * 2; } else if (typeof input === "string") { return (parseInt(input) * 2).toString(); } throw new Error("Invalid input");}
این روش کار میکند، اما مشکلی که دارد این است که تایپ خروجی به صورت کلی number | string است و TypeScript نمیتواند دقیقاً پیشبینی کند که چه نوع دادهای بازخواهد گشت. اینجاست که Function Overloading به کمک ما میآید. در TypeScript، برای پیادهسازی Function Overloading ابتدا امضای توابع (Function Signatures) را تعریف میکنیم. این امضاها مشخص میکنند که تابع چه ورودیهایی را قبول میکند و چه خروجیای بازمیگرداند. سپس در قسمت پیادهسازی، منطق اصلی تابع را مینویسیم.
function calculate(input: number): number; function calculate(input: string): string; function calculate(input: any): any { if (typeof input === "number") { return input * 2; } else if (typeof input === "string") { return (parseInt(input) * 2).toString(); } throw new Error("Invalid input");}
امضاهای تابع (Signatures): مشخص میکنند که تابع با چه نوع ورودیهایی فراخوانی میشود. پیادهسازی تابع: باید تمامی سناریوهای تعریفشده در امضاها را پوشش دهد. Type Safety (ایمنی تایپ): با استفاده از Function Overloading، TypeScript به طور دقیق نوع ورودی و خروجی را بررسی میکند. ر پیادهسازی تابع، میتوان به جای any از تایپهای خاص (مثل number | string) استفاده کرد. اما استفاده از any گاهی سادهتر است. امضاهای تابع باید ترتیب مشخصی داشته باشند. TypeScript از بالا به پایین این امضاها را بررسی میکند، بنابراین ابتدا حالات خاصتر را تعریف کنید. Function Overloading یکی از قابلیتهای مهم TypeScript است که به ما کمک میکند توابعی با رفتارهای متنوع ولی ساختاری منسجم بسازیم. با استفاده از این قابلیت میتوانیم کدهای خواناتر، امنتر و انعطافپذیرتری بنویسیم. اگر در پروژههای خود با سناریوهایی مواجه هستید که نیاز به پشتیبانی از ورودیهای مختلف دارید، Function Overloading راهحل ایدهآلی است.