جنریک های پایه (Basic Generics)
جنریک تایپ اسکریپت یعنی «متغیر نوع». یعنی نوع را بعداً بدهیم. بنابراین کد ما قابل استفاده مجدد می شود و همچنین دقیق تر تایپ می شود.
توابع جنریک
تابع جنریک ورودی و خروجی را دقیق نگه می دارد. سپس اشتباهات کمتر می شود.
function createPair<S, T>(v1: S, v2: T): [S, T] {
return [v1, v2];
}
console.log(createPair<string, number>("hello", 42));
کلاس های جنریک
کلاس جنریک داده را با هر نوعی نگه می دارد. اما همچنان تایپ ایمن می ماند.
class NamedValue<T> {
private _value: T | undefined;
public constructor(private name: string) {
}
public setValue(value: T): void {
this._value = value;
}
public getValue(): T | undefined {
return this._value;
}
public toString(): string {
return `${this.name}: ${this._value}`;
}
}
let value: NamedValue<number> = new NamedValue<number>("myNumber");
value.setValue(10);
console.log(value.toString());
نام مستعار نوع جنریک
با تایپ الیاس (Type Alias) می توان نوعِ قابل استفاده مجدد ساخت.
type Wrapped<T> = { value: T };
const wrappedValue: Wrapped<number> = { value: 10 };
مقدار پیش فرض جنریک
می توان برای جنریک مقدار پیش فرض گذاشت. سپس نوشتن کوتاه تر می شود.
class NamedValue<T = string> {
private _value: T | undefined;
public constructor(private name: string) {
}
public setValue(value: T): void {
this._value = value;
}
public getValue(): T | undefined {
return this._value;
}
public toString(): string {
return `${this.name}: ${this._value}`;
}
}
let value: NamedValue<string> = new NamedValue("myNumber");
value.setValue("myValue");
console.log(value.toString());
قیود با extends
قید یعنی محدودیت نوع. بنابراین فقط نوع های مجاز پذیرفته می شوند.
function createLoggedPair<S extends string | number, T extends string | number>(v1: S, v2: T): [S, T] {
console.log(`creating pair: v1='${v1}', v2='${v2}'`);
return [v1, v2];
}
گام های عملی
- اول امضای تابع جنریک را بنویس.
- بعد نوع پارامترها و خروجی را دقیق کن.
- سپس در صورت نیاز قید و پیش فرض بده.
همچنین برای تکمیل مطالعه، صفحه توابع و کلاس ها را ببین. برای ادامه جنریک های تایپ اسکریپت به ابزارهای کمکی برو.
جمع بندی سریع
- جنریک یعنی نوع را بعداً مشخص کن.
- تابع جنریک خروجی دقیق تری می دهد.
- کلاس جنریک انعطاف بالاتری دارد.
- قید با
extendsجلوی خطا را می گیرد. - پیش فرض نوشتن را ساده تر می کند.