ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 3 · 2లో పాఠం 2కోర్సులో 6/14~15 min
మాడ్యూల్ పాఠాలు (2/2)

ఫండమెంటల్ జెనరిక్స్

జెనరిక్స్ (జెనరిక్ ప్రోగ్రామింగ్) టైప్‌స్క్రిప్ట్ యొక్క అత్యంత శక్తివంతమైన లక్షణాలలో ఒకటి. గరిష్ట రకం భద్రతను కొనసాగిస్తూ మరియు any వినియోగాన్ని నివారిస్తూ విభిన్న డేటా రకాలతో పని చేయగల సౌకర్యవంతమైన, పునర్వినియోగపరచదగిన భాగాలు, విధులు మరియు ఇంటర్‌ఫేస్‌లను వ్రాయడానికి అవి మిమ్మల్ని అనుమతిస్తాయి.


సాధారణ విధులు

రకాల కోసం వేరియబుల్‌గా జెనరిక్ గురించి ఆలోచించండి. దానికి పంపబడిన విలువను ఆర్గ్యుమెంట్‌గా తిరిగి ఇచ్చే ఫంక్షన్‌ని పరిశీలిద్దాం:

TS
function identity<T>(arg: T): T {
  return arg;
}

T అక్షరం (Typeకి చిన్నది) రకానికి ప్లేస్‌హోల్డర్. మేము identityకి కాల్ చేసినప్పుడు, TypeScript ఆమోదించబడిన ఆర్గ్యుమెంట్ రకాన్ని సంగ్రహిస్తుంది మరియు స్వయంచాలకంగా Tని ఆ రకానికి సెట్ చేస్తుంది:

TS
const str = identity<string>('Hello'); // T is string
const num = identity(42); // T is number (automatically inferred!)

సాధారణ ఇంటర్‌ఫేస్‌లు మరియు మారుపేర్లు

జెనరిక్ కంటైనర్‌లు లేదా డేటా స్ట్రక్చర్‌లను నిర్వచించడానికి ఇంటర్‌ఫేస్‌లు మరియు టైప్ మారుపేర్లకు కూడా జెనరిక్స్ వర్తించవచ్చు:

TS
interface Box<T> {
  content: T;
}

const stringBox: Box<string> = { content: 'TypeScript' };
const numberBox: Box<number> = { content: 42 };

బహుళ రకం పారామితులు

మేము బహుళ రకం వేరియబుల్‌లను ఉపయోగించే ఫంక్షన్‌లు లేదా రకాలను నిర్వచించగలము (ఉదా., T మరియు U):

TS
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

సాధారణ పరిమితులు

కొన్నిసార్లు మేము జెనరిక్ ద్వారా ఆమోదించబడిన రకాలను పరిమితం చేయాలనుకుంటున్నాము. మేము పరిమితిని జోడించడానికి extends కీవర్డ్‌ని ఉపయోగించవచ్చు.

ఉదాహరణకు, మేము సాధారణ రకం ఎల్లప్పుడూ length ఆస్తిని కలిగి ఉండాలని కోరుకుంటే (తీగలు లేదా శ్రేణుల వంటివి):

TS
interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(arg: T): void {
  console.log(arg.length); // Safe! We know arg has 'length'
}

logLength('Hello'); // Valid
logLength([1, 2, 3]); // Valid
// logLength(42); // Error: number does not have a length property!

మీరే ప్రయత్నించండి

వ్యాయామం 1: సాధారణ గుర్తింపు ఫంక్షన్

వ్యాయామం#ts.m3.l2.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

జెనరిక్ ఐడెంటిటీ ఫంక్షన్‌ను పూర్తి చేయండి, తద్వారా ఇది జెనరిక్ టైప్ T యొక్క విలువ పరామితిని అంగీకరిస్తుంది మరియు మార్పు లేకుండా దాన్ని అందిస్తుంది.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

తిరిగి వచ్చే రకం తప్పనిసరిగా పరామితి వలె అదే సాధారణ రకం T అయి ఉండాలి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 2: జెనరిక్ బాక్స్ రేపర్

వ్యాయామం#ts.m3.l2.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

T రకం పరామితిని ఆమోదించే మరియు T రకం కంటెంట్ పేరుతో ఒకే ఆస్తిని కలిగి ఉండే Box అనే జెనరిక్ ఇంటర్‌ఫేస్‌ను నిర్వచించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

ఇంటర్‌ఫేస్ బాక్స్‌ని ఉపయోగించండి<T> {content: T; } వాక్యనిర్మాణం.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 3: సాధారణ నిర్బంధం

వ్యాయామం#ts.m3.l2.e3
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

పారామీటర్ ఆర్గ్‌ని ఆమోదించే getLength అనే జెనరిక్ ఫంక్షన్‌ను వ్రాయండి. arg తప్పనిసరిగా పొడవు ప్రాపర్టీ (సంఖ్య) కలిగి ఉన్న ఇంటర్‌ఫేస్‌కు పరిమితం చేయబడాలి. ఫంక్షన్ తప్పనిసరిగా arg.lengthని అందించాలి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

ఫంక్షన్‌ను getLength<T విస్తరింపజేస్తుంది HasLength>(arg: T): సంఖ్య మరియు arg.lengthని తిరిగి ఇవ్వండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం 4: సాధారణ జంట

వ్యాయామం#ts.m3.l2.e4
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

రెండు లక్షణాలతో జెనరిక్ ఇంటర్‌ఫేస్ పెయిర్<T, U>ని నిర్వచించండి: మొదటి రకం T మరియు రెండవ రకం U. తర్వాత, మొదటి (T రకం) మరియు రెండవ (రకం U)ని అంగీకరించి, పెయిర్ <T, U>ని అమలు చేసే వస్తువును తిరిగి ఇచ్చే జెనరిక్ ఫంక్షన్ makePairని సృష్టించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

రెండు జెనరిక్ పారామితుల కోసం సింటాక్స్‌ని ఉపయోగించండి జత<T, U> మరియు తదనుగుణంగా makePair నిర్వచించండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది