نحوه عملکرد TypeScript Generics – با مثال توضیح داده شده است
TypeScript با سیستم تایپ قدرتمند خود، قابلیتی به نام Generics را ارائه می دهد که به توسعه دهندگان امکان می دهد کدهای قابل استفاده مجدد و ایمن را بنویسند. Generics به شما اجازه می دهد تا اجزایی ایجاد کنید که می توانند روی انواع مختلف کار کنند تا تکی.
این مقاله به تحلیل Generics TypeScript می پردازد و توضیحات کامل و نمونه های کد را برای نشان دادن استفاده و مزایای آنها ارائه می دهد.
می توانید تمام کد منبع را از اینجا دریافت کنید.
فهرست مطالب
موارد استفاده از Generics TypeScript
ژنریک چیست؟
Generics در TypeScript نوشتن کد را فعال می کند که می تواند با انواع داده ها کار کند و در عین حال ایمنی نوع را حفظ کند. آنها امکان ایجاد اجزاء، توابع و ساختارهای داده قابل استفاده مجدد را بدون به خطر انداختن تحلیل نوع می دهند.
دیگر اخبار
آیووا در یک شکایت جدید، TikTok را به دروغگویی در مورد محتوای موجود برای کودکان متهم می کند
ژنریک ها با پارامترهای نوع نشان داده می شوند که به عنوان مکان نگهدار برای انواع عمل می کنند. این پارامترها در براکت های زاویه ای ( <>
) مشخص می شوند و می توانند در سراسر کد برای تعریف انواع متغیرها، پارامترهای تابع، انواع برگشتی و موارد دیگر استفاده شوند.
موارد استفاده از Generics TypeScript
استفاده اساسی از ژنریک
بیایید با یک مثال ساده از یک تابع عمومی شروع کنیم:
function identity<T>(arg: T): T { return arg; } let output = identity<string>("hello"); console.log(output); // Output: hello
در این مثال، identity
یک تابع عمومی است که یک پارامتر نوع T
را می گیرد. پارامتر arg
از نوع T
است و نوع برگشتی تابع نیز T
است. هنگام فراخوانی identity<string>("hello")
، پارامتر نوع T
به عنوان string
استنباط می شود که ایمنی نوع را تضمین می کند.
نحوه استفاده از کلاس های عمومی
ژنریک ها به توابع محدود نمی شوند - آنها همچنین می توانند با کلاس ها استفاده شوند. مثال زیر از یک کلاس Box
عمومی را در نظر بگیرید:
class Box<T> { private value: T; constructor(value: T) { this.value = value; } getValue(): T { return this.value; } } let box = new Box<number>(42); console.log(box.getValue()); // Output: 42
در اینجا، Box
یک کلاس عمومی با پارامتر نوع T
است. سازنده مقداری از نوع T
می گیرد و متد getValue
مقداری از نوع T
را برمی گرداند. هنگام ایجاد نمونه ای از Box<number>
، فقط می تواند مقادیر نوع number
را ذخیره و برگرداند.
نحوه اعمال محدودیت در Generics
گاهی اوقات، ممکن است بخواهید انواعی را که می توان با ژنریک ها استفاده کرد محدود کنید. TypeScript به شما این امکان را می دهد که با استفاده از کلمه کلیدی extends
محدودیت هایی را بر روی پارامترهای نوع مشخص کنید. بیایید یک مثال را ببینیم:
interface Lengthwise { length: number; } function loggingIdentity<T extends Lengthwise>(arg: T): T { console.log(arg.length); return arg; } let result = loggingIdentity("hello"); console.log(result); // Output: hello
در این مثال، تابع loggingIdentity
یک پارامتر نوع T
را می گیرد که باید رابط Lengthwise
را گسترش دهد، که تضمین می کند arg
دارای ویژگی length
است. این محدودیت امکان دسترسی به ویژگی length
را بدون ایجاد خطای کامپایل فراهم می کند.
نحوه استفاده از Generics با رابط ها
ژنریک ها همچنین می توانند با رابط ها برای ایجاد تعاریف انعطاف پذیر و قابل استفاده مجدد استفاده شوند. به مثال زیر توجه کنید:
interface Pair<T, U> { first: T; second: U; } let pair: Pair<number, string> = { first: 1, second: "two" }; console.log(pair); // Output: { first: 1, second: "two" }
در اینجا، Pair
یک رابط با دو پارامتر نوع T
و U
است که به ترتیب نشان دهنده انواع ویژگی های first
و second
است. هنگامی که pair
به عنوان Pair<number, string>
اعلان می کنیم، الزام می کند که ویژگی first
باید یک عدد باشد و خاصیت second
باید یک رشته باشد.
نحوه استفاده از توابع عمومی با آرایه
function reverse<T>(array: T[]): T[] { return array.reverse(); } let numbers: number[] = [1, 2, 3, 4, 5]; let reversedNumbers: number[] = reverse(numbers); console.log(reversedNumbers); // Output: [5, 4, 3, 2, 1]
در این مثال، تابع reverse
آرایه ای از نوع T
را می گیرد و یک آرایه معکوس از همان نوع را برمی گرداند. با استفاده از ژنریک، این تابع می تواند با آرایه ها از هر نوع کار کند و ایمنی نوع را تضمین کند.
نحوه استفاده از محدودیت های عمومی با keyof
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; } let person = { name: "John", age: 30, city: "New York" }; let age: number = getProperty(person, "age"); console.log(age); // Output: 30
در اینجا تابع getProperty
یک شی از نوع T
و یک کلید از نوع K
را می گیرد که در آن K
کلیدهای T
را گسترش می دهد. سپس مقدار خاصیت مربوطه را از شی برمی گرداند. این مثال نحوه استفاده از ژنریک ها با keyof
برای اعمال ایمنی نوع هنگام دسترسی به ویژگی های شی را نشان می دهد.
نحوه استفاده از توابع عمومی Utility
function toArray<T>(value: T): T[] { return [value]; } let numberArray: number[] = toArray(42); console.log(numberArray); // Output: [42] let stringArray: string[] = toArray("hello"); console.log(stringArray); // Output: ["hello"]
تابع toArray
یک مقدار واحد از نوع T
را به آرایه ای حاوی آن مقدار تبدیل می کند. این تابع ساده نشان می دهد که چگونه می توان از ژنریک برای ایجاد کد قابل استفاده مجدد استفاده کرد که بدون زحمت با انواع داده های مختلف سازگار می شود.
نحوه استفاده از رابط های عمومی با یک تابع
interface Transformer<T, U> { (input: T): U; } function uppercase(input: string): string { return input.toUpperCase(); } let transform: Transformer<string, string> = uppercase; console.log(transform("hello")); // Output: HELLO
در این مثال، ما یک رابط Transformer
با دو پارامتر نوع T
و U
تعریف می کنیم که به ترتیب نوع ورودی و خروجی را نشان می دهد. سپس یک تابع را uppercase
اعلام می کنیم و آن را به یک transform
متغیر از نوع Transformer<string, string>
نسبت می دهیم. این نشان می دهد که چگونه می توان از ژنریک برای تعریف رابط های انعطاف پذیر برای توابع استفاده کرد.
نتیجه
چه توابع، کلاس ها یا رابط ها، ژنریک ها مکانیزم قوی برای ساخت برنامه های TypeScript مقیاس پذیر و قابل نگهداری ارائه می دهند. درک و تسلط بر اصول عمومی می تواند توانایی شما در نوشتن کد کارآمد و بدون خطا را به میزان قابل توجهی افزایش دهد.
ارسال نظر