مبحث بسیار مهم Generic

موقع نوشتن برنامه یکی از جنبه های مهم، ساخت کامپوننت یا اجزا با قابلیت استفاده مجدد است. مبحث جنریک تضمین میکند که برنامه شما در  طولانی مدت، انعطاف پذیر و مقیاس پذیر باشد. Generic راهی برای ایجاد اجزا (کامپوننت های) قابل استفاده مجدد ارائه میدهد.

* Generic ها روشی را برای کار با مؤلفه ها، آرگومان ها یا پارامتر ها یا هر نوع داده دیگری ارائه میدهند و محدود به یک نوع داده نمیشوند.

* بنابراین کامپوننت ها (اجزا) با انواع مختلف داده ها، میتوانند فراخوانی شوند و مورد استفاده قرار بگیرند.

 

به مثال زیر برای درک ضرورت استفاده از نوع داده Generic توجه نمائید:

 

unction getArray(items:any[]):any[]{
    return new Array().concat(items);
}

let myNumArr = getArray([100,105,99,76,20,23,65]);
let myStrArr = getArray(["Hello","world"]);

myNumArr.push("hi from world");
myStrArr.push(1399);

console.log(myNumArr);
console.log(myStrArr);
//------------------------------------- نتیجه
[ 100, 105, 99, 76, 20, 23, 65, 'hi from world' ]
[ 'Hello', 'world', 1399 ]

نتایج فوق را بررسی کنید.

شاید نخواهیم نوع داده رشته ای درون آرایه عددی قرار بگیرد و یا بر عکس نخواهیم نوع داده عددی درون آرایه رشته ای قرار گیرد.

مثال مفهومی:

function echo<T>(data:T){
    return data;
}

console.log(echo<string>("Mokhtar").length);
console.log(echo<number>(34));

درتابع فوق که یک تابع چنریک شده است.<T> نوع داده ای است که قرار است استفاده شود. و اگر هنگام استفاده از تابع ذکر نشود از T استفاده میشود یعنی نوع داده ورودی تابع.

built-in generics - جنریک های داخلی

بسیاری از اشیا جاوااسکریپت، در تایپ اسکریپت دارای نوع داده جنریک هستند مثلا آرایه ها. مثال:

const testResult :Array<number> = [226,-236,456];
testResult.push(34);
console.log(testResult)

یک مثال دیگر از توابع جنریک به همراه استفاده از آرایه.

function printAll<T>(args:T[]){
    args.forEach(elm=>{
        console.log(elm)
    })
}

printAll<string>(['Apple','Banana'])

نوع داده جنریک - Generic Types

type echoType = <T>(data:T)=>T;

const echo2:echoType = echo;
console.log(echo2<string>("somethings"))

انواع دیگر مثال ها و روش های استفاده

<T>
<T,U>
<T extends یک نوع سفارشی>
<T extends number>
<T extends number|string>

const testType:<T extends ...>
const testType:<T>(data:T)=>T;

<T,U extends number|string>
<T extends number,U extends string>

<T extends U>
<T extends U, U extends number|string>