మరింత వ్యక్తీకరణ మరియు నిర్వహణ సులభమైన కోడ్ రాయడానికి టెంప్లేట్ లిటరల్ టైప్స్ మరియు కండిషనల్ టైప్స్ వంటి అధునాతన టైప్స్క్రిప్ట్ ఫీచర్లను అన్వేషించండి. సంక్లిష్ట దృశ్యాల కోసం టైప్ మానిప్యులేషన్లో నైపుణ్యం సాధించండి.
టైప్స్క్రిప్ట్ అడ్వాన్స్డ్ టైప్స్: టెంప్లేట్ లిటరల్ మరియు కండిషనల్ టైప్స్లో నైపుణ్యం సాధించడం
టైప్స్క్రిప్ట్ యొక్క బలం దాని శక్తివంతమైన టైప్ సిస్టమ్లో ఉంది. చాలా సందర్భాలలో string, number, మరియు boolean వంటి ప్రాథమిక టైప్స్ సరిపోతాయి, కానీ టెంప్లేట్ లిటరల్ టైప్స్ మరియు కండిషనల్ టైప్స్ వంటి అధునాతన ఫీచర్లు కొత్త స్థాయి వ్యక్తీకరణ మరియు టైప్ సేఫ్టీని అందిస్తాయి. ఈ గైడ్ ఈ అధునాతన టైప్స్పై ఒక సమగ్ర అవలోకనాన్ని అందిస్తుంది, వాటి సామర్థ్యాలను అన్వేషిస్తుంది మరియు ఆచరణాత్మక అనువర్తనాలను ప్రదర్శిస్తుంది.
టెంప్లేట్ లిటరల్ టైప్స్ను అర్థం చేసుకోవడం
టెంప్లేట్ లిటరల్ టైప్స్, జావాస్క్రిప్ట్ యొక్క టెంప్లేట్ లిటరల్స్ ఆధారంగా నిర్మించబడ్డాయి, ఇది స్ట్రింగ్ ఇంటర్పోలేషన్ ఆధారంగా టైప్స్ను నిర్వచించడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది నిర్దిష్ట స్ట్రింగ్ నమూనాలను సూచించే టైప్స్ను సృష్టించడానికి వీలు కల్పిస్తుంది, మీ కోడ్ను మరింత పటిష్టంగా మరియు ఊహాజనితంగా చేస్తుంది.
ప్రాథమిక సింటాక్స్ మరియు వాడకం
టెంప్లేట్ లిటరల్ టైప్స్ జావాస్క్రిప్ట్ టెంప్లేట్ లిటరల్స్ మాదిరిగానే, టైప్ డెఫినిషన్ను చేర్చడానికి బ్యాక్టిక్స్ను (`) ఉపయోగిస్తాయి. బ్యాక్టిక్స్ లోపల, మీరు ${} సింటాక్స్ ఉపయోగించి ఇతర టైప్స్ను ఇంటర్పోలేట్ చేయవచ్చు. ఇక్కడే అసలు మ్యాజిక్ జరుగుతుంది – మీరు ఇంటర్పోలేషన్ లోపల ఉన్న టైప్స్ ఆధారంగా కంపైల్ సమయంలో నిర్మించబడిన ఒక స్ట్రింగ్ అయిన టైప్ను సృష్టిస్తున్నారు.
type HTTPMethod = "GET" | "POST" | "PUT" | "DELETE";
type APIEndpoint = `/api/${string}`;
// ఉదాహరణ వాడకం
const getEndpoint: APIEndpoint = "/api/users"; // చెల్లుతుంది
const postEndpoint: APIEndpoint = "/api/products/123"; // చెల్లుతుంది
const invalidEndpoint: APIEndpoint = "/admin/settings"; // టైప్స్క్రిప్ట్ ఇక్కడ దోషాన్ని చూపదు ఎందుకంటే `string` ఏదైనా కావచ్చు
ఈ ఉదాహరణలో, APIEndpoint అనేది /api/ తో ప్రారంభమయ్యే ఏదైనా స్ట్రింగ్ను సూచించే ఒక టైప్. ఈ ప్రాథమిక ఉదాహరణ ఉపయోగకరంగా ఉన్నప్పటికీ, టెంప్లేట్ లిటరల్ టైప్స్ యొక్క నిజమైన శక్తి మరింత నిర్దిష్ట టైప్ పరిమితులతో కలిసినప్పుడు బయటపడుతుంది.
యూనియన్ టైప్స్తో కలపడం
యూనియన్ టైప్స్తో ఉపయోగించినప్పుడు టెంప్లేట్ లిటరల్ టైప్స్ నిజంగా ప్రకాశిస్తాయి. ఇది ఒక నిర్దిష్ట స్ట్రింగ్ కలయికల సమితిని సూచించే టైప్స్ను సృష్టించడానికి మిమ్మల్ని అనుమతిస్తుంది.
type HTTPMethod = "GET" | "POST" | "PUT" | "DELETE";
type APIPath = "users" | "products" | "orders";
type APIEndpoint = `/${APIPath}/${HTTPMethod}`;
// చెల్లుబాటు అయ్యే API ఎండ్పాయింట్స్
const getUsers: APIEndpoint = "/users/GET";
const postProducts: APIEndpoint = "/products/POST";
// చెల్లని API ఎండ్పాయింట్స్ (టైప్స్క్రిప్ట్ దోషాలకు దారితీస్తాయి)
// const invalidEndpoint: APIEndpoint = "/users/PATCH"; // దోషం: "/users/PATCH" టైప్ "/users/GET" | "/users/POST" | "/users/PUT" | "/users/DELETE" | "/products/GET" | "/products/POST" | ... 3 మరిన్ని ... | "/orders/DELETE"కు కేటాయించబడదు.
ఇప్పుడు, APIEndpoint అనేది API పాత్లు మరియు HTTP మెథడ్స్ యొక్క నిర్దిష్ట కలయికలను మాత్రమే అనుమతించే మరింత కఠినమైన టైప్. చెల్లని కలయికలను ఉపయోగించే ఏ ప్రయత్నాలనైనా టైప్స్క్రిప్ట్ ఫ్లాగ్ చేస్తుంది, టైప్ సేఫ్టీని పెంచుతుంది.
టెంప్లేట్ లిటరల్ టైప్స్తో స్ట్రింగ్ మానిప్యులేషన్
టైప్స్క్రిప్ట్ టెంప్లేట్ లిటరల్ టైప్స్తో సజావుగా పనిచేసే అంతర్గత స్ట్రింగ్ మానిప్యులేషన్ టైప్స్ను అందిస్తుంది. ఈ టైప్స్ కంపైల్ సమయంలో స్ట్రింగ్లను మార్చడానికి మిమ్మల్ని అనుమతిస్తాయి.
- Uppercase: ఒక స్ట్రింగ్ను పెద్ద అక్షరాలకు మారుస్తుంది.
- Lowercase: ఒక స్ట్రింగ్ను చిన్న అక్షరాలకు మారుస్తుంది.
- Capitalize: ఒక స్ట్రింగ్ యొక్క మొదటి అక్షరాన్ని పెద్దదిగా చేస్తుంది.
- Uncapitalize: ఒక స్ట్రింగ్ యొక్క మొదటి అక్షరాన్ని చిన్నదిగా చేస్తుంది.
type Greeting = "hello world";
type UppercaseGreeting = Uppercase; // "HELLO WORLD"
type LowercaseGreeting = Lowercase; // "hello world"
type CapitalizedGreeting = Capitalize; // "Hello world"
type UncapitalizedGreeting = Uncapitalize; // "hello world"
ఈ స్ట్రింగ్ మానిప్యులేషన్ టైప్స్ నామకరణ సంప్రదాయాల ఆధారంగా టైప్స్ను ఆటోమేటిక్గా రూపొందించడానికి చాలా ఉపయోగకరంగా ఉంటాయి. ఉదాహరణకు, మీరు ఈవెంట్ పేర్ల నుండి యాక్షన్ టైప్స్ను లేదా దానికి విరుద్ధంగా రూపొందించవచ్చు.
టెంప్లేట్ లిటరల్ టైప్స్ యొక్క ఆచరణాత్మక అనువర్తనాలు
- API ఎండ్పాయింట్ డెఫినిషన్: పైన చూపిన విధంగా, కచ్చితమైన టైప్ పరిమితులతో API ఎండ్పాయింట్స్ను నిర్వచించడం.
- ఈవెంట్ హ్యాండ్లింగ్: నిర్దిష్ట ప్రిఫిక్స్లు మరియు సఫిక్స్లతో ఈవెంట్ పేర్ల కోసం టైప్స్ను సృష్టించడం.
- CSS క్లాస్ జనరేషన్: కాంపోనెంట్ పేర్లు మరియు స్టేట్స్ ఆధారంగా CSS క్లాస్ పేర్లను రూపొందించడం.
- డేటాబేస్ క్వెరీ బిల్డింగ్: డేటాబేస్ క్వెరీలను నిర్మించేటప్పుడు టైప్ సేఫ్టీని నిర్ధారించడం.
అంతర్జాతీయ ఉదాహరణ: కరెన్సీ ఫార్మాటింగ్
బహుళ కరెన్సీలకు మద్దతు ఇచ్చే ఆర్థిక అప్లికేషన్ను నిర్మిస్తున్నట్లు ఊహించుకోండి. సరైన కరెన్సీ ఫార్మాటింగ్ను అమలు చేయడానికి మీరు టెంప్లేట్ లిటరల్ టైప్స్ను ఉపయోగించవచ్చు.
type CurrencyCode = "USD" | "EUR" | "GBP" | "JPY";
type CurrencyFormat = `${number} ${T}`;
const priceUSD: CurrencyFormat<"USD"> = "100 USD"; // చెల్లుతుంది
const priceEUR: CurrencyFormat<"EUR"> = "50 EUR"; // చెల్లుతుంది
// const priceInvalid: CurrencyFormat<"USD"> = "100 EUR"; // దోషం: టైప్ 'string' టైప్ '`${number} USD`'కు కేటాయించబడదు.
function formatCurrency(amount: number, currency: T): CurrencyFormat {
return `${amount} ${currency}`;
}
const formattedUSD = formatCurrency(250, "USD"); // టైప్: "250 USD"
const formattedEUR = formatCurrency(100, "EUR"); // టైప్: "100 EUR"
ఈ ఉదాహరణ కరెన్సీ విలువలు ఎల్లప్పుడూ సరైన కరెన్సీ కోడ్తో ఫార్మాట్ చేయబడతాయని నిర్ధారిస్తుంది, సంభావ్య దోషాలను నివారిస్తుంది.
కండిషనల్ టైప్స్లోకి లోతుగా వెళ్లడం
కండిషనల్ టైప్స్ టైప్స్క్రిప్ట్ యొక్క టైప్ సిస్టమ్లోకి బ్రాంచింగ్ లాజిక్ను పరిచయం చేస్తాయి, ఇతర టైప్స్పై ఆధారపడి టైప్స్ను నిర్వచించడానికి మిమ్మల్ని అనుమతిస్తాయి. అత్యంత అనువైన మరియు పునర్వినియోగించగల టైప్ డెఫినిషన్లను సృష్టించడానికి ఈ ఫీచర్ చాలా శక్తివంతమైనది.
ప్రాథమిక సింటాక్స్ మరియు వాడకం
కండిషనల్ టైప్స్ infer కీవర్డ్ మరియు టెర్నరీ ఆపరేటర్ను (condition ? trueType : falseType) టైప్ కండిషన్స్ను నిర్వచించడానికి ఉపయోగిస్తాయి.
type IsString = T extends string ? true : false;
type StringCheck = IsString; // type StringCheck = true
type NumberCheck = IsString; // type NumberCheck = false
ఈ ఉదాహరణలో, IsString అనేది ఒక కండిషనల్ టైప్, ఇది T stringకు కేటాయించదగినదో లేదో తనిఖీ చేస్తుంది. అలా అయితే, టైప్ trueగా రిసాల్వ్ అవుతుంది; లేకపోతే, అది falseగా రిసాల్వ్ అవుతుంది.
infer కీవర్డ్
infer కీవర్డ్ ఒక టైప్ నుండి మరొక టైప్ను సంగ్రహించడానికి అనుమతిస్తుంది. ఫంక్షన్ టైప్స్ లేదా అర్రే టైప్స్ వంటి సంక్లిష్ట టైప్స్తో పనిచేసేటప్పుడు ఇది చాలా ఉపయోగకరంగా ఉంటుంది.
type ReturnType any> = T extends (...args: any) => infer R ? R : any;
function add(a: number, b: number): number {
return a + b;
}
type AddReturnType = ReturnType; // type AddReturnType = number
ఈ ఉదాహరణలో, ReturnType ఒక ఫంక్షన్ టైప్ T యొక్క రిటర్న్ టైప్ను సంగ్రహిస్తుంది. కండిషనల్ టైప్లోని infer R భాగం రిటర్న్ టైప్ను ఇన్ఫర్ చేసి దానిని టైప్ వేరియబుల్ Rకు కేటాయిస్తుంది. T ఒక ఫంక్షన్ టైప్ కాకపోతే, టైప్ anyగా రిసాల్వ్ అవుతుంది.
డిస్ట్రిబ్యూటివ్ కండిషనల్ టైప్స్
తనిఖీ చేయబడిన టైప్ ఒక నేకెడ్ టైప్ పారామీటర్ అయినప్పుడు కండిషనల్ టైప్స్ డిస్ట్రిబ్యూటివ్ అవుతాయి. దీని అర్థం కండిషనల్ టైప్ యూనియన్ టైప్ యొక్క ప్రతి సభ్యునికి విడిగా వర్తింపజేయబడుతుంది.
type ToArray = T extends any ? T[] : never;
type NumberOrStringArray = ToArray; // type NumberOrStringArray = string[] | number[]
ఈ ఉదాహరణలో, ToArray ఒక టైప్ Tని అర్రే టైప్గా మారుస్తుంది. ఎందుకంటే T ఒక నేకెడ్ టైప్ పారామీటర్ (మరొక టైప్లో చుట్టబడి లేదు), కండిషనల్ టైప్ number మరియు stringకు విడిగా వర్తింపజేయబడుతుంది, ఫలితంగా number[] మరియు string[] యొక్క యూనియన్ వస్తుంది.
కండిషనల్ టైప్స్ యొక్క ఆచరణాత్మక అనువర్తనాలు
- రిటర్న్ టైప్స్ను సంగ్రహించడం: పైన చూపిన విధంగా, ఒక ఫంక్షన్ యొక్క రిటర్న్ టైప్ను సంగ్రహించడం.
- ఒక యూనియన్ నుండి టైప్స్ను ఫిల్టర్ చేయడం: ఒక యూనియన్ నుండి నిర్దిష్ట టైప్స్ను మాత్రమే కలిగి ఉన్న టైప్ను సృష్టించడం.
- ఓవర్లోడెడ్ ఫంక్షన్ టైప్స్ను నిర్వచించడం: ఇన్పుట్ టైప్స్ ఆధారంగా వివిధ ఫంక్షన్ టైప్స్ను సృష్టించడం.
- టైప్ గార్డ్స్ సృష్టించడం: ఒక వేరియబుల్ యొక్క టైప్ను తగ్గించే ఫంక్షన్లను నిర్వచించడం.
అంతర్జాతీయ ఉదాహరణ: వివిధ తేదీ ఫార్మాట్లను నిర్వహించడం
ప్రపంచంలోని వివిధ ప్రాంతాలు వేర్వేరు తేదీ ఫార్మాట్లను ఉపయోగిస్తాయి. ఈ వైవిధ్యాలను నిర్వహించడానికి మీరు కండిషనల్ టైప్స్ను ఉపయోగించవచ్చు.
type DateFormat = "YYYY-MM-DD" | "MM/DD/YYYY" | "DD.MM.YYYY";
type ParseDate = T extends "YYYY-MM-DD"
? { year: number; month: number; day: number; format: "YYYY-MM-DD" }
: T extends "MM/DD/YYYY"
? { month: number; day: number; year: number; format: "MM/DD/YYYY" }
: T extends "DD.MM.YYYY"
? { day: number; month: number; year: number; format: "DD.MM.YYYY" }
: never;
function parseDate(dateString: string, format: T): ParseDate {
// (అమలు వివిధ తేదీ ఫార్మాట్లను నిర్వహిస్తుంది)
if (format === "YYYY-MM-DD") {
const [year, month, day] = dateString.split("-").map(Number);
return { year, month, day, format } as ParseDate;
} else if (format === "MM/DD/YYYY") {
const [month, day, year] = dateString.split("/").map(Number);
return { month, day, year, format } as ParseDate;
} else if (format === "DD.MM.YYYY") {
const [day, month, year] = dateString.split(".").map(Number);
return { day, month, year, format } as ParseDate;
} else {
throw new Error("చెల్లని తేదీ ఫార్మాట్");
}
}
const parsedDateISO = parseDate("2023-10-27", "YYYY-MM-DD"); // టైప్: { year: number; month: number; day: number; format: "YYYY-MM-DD"; }
const parsedDateUS = parseDate("10/27/2023", "MM/DD/YYYY"); // టైప్: { month: number; day: number; year: number; format: "MM/DD/YYYY"; }
const parsedDateEU = parseDate("27.10.2023", "DD.MM.YYYY"); // టైప్: { day: number; month: number; year: number; format: "DD.MM.YYYY"; }
console.log(parsedDateISO.year); // సంవత్సరం ఉంటుందని తెలిసి దాన్ని యాక్సెస్ చేయండి
ఈ ఉదాహరణ పేర్కొన్న తేదీ ఫార్మాట్ ఆధారంగా వివిధ తేదీ పార్సింగ్ ఫంక్షన్లను నిర్వచించడానికి కండిషనల్ టైప్స్ను ఉపయోగిస్తుంది. ParseDate టైప్, తిరిగి వచ్చే ఆబ్జెక్ట్ ఫార్మాట్ ఆధారంగా సరైన ప్రాపర్టీలను కలిగి ఉందని నిర్ధారిస్తుంది.
టెంప్లేట్ లిటరల్ మరియు కండిషనల్ టైప్స్ను కలపడం
మీరు టెంప్లేట్ లిటరల్ టైప్స్ మరియు కండిషనల్ టైప్స్ను కలిపినప్పుడు అసలైన శక్తి వస్తుంది. ఇది చాలా శక్తివంతమైన టైప్ మానిప్యులేషన్లను అనుమతిస్తుంది.
type EventName = `on${Capitalize}`;
type ExtractEventPayload = T extends EventName
? { type: T; payload: any } // ప్రదర్శన కోసం సులభతరం చేయబడింది
: never;
type ClickEvent = EventName<"click">; // "onClick"
type MouseOverEvent = EventName<"mouseOver">; // "onMouseOver"
//ఒక టైప్ను తీసుకునే ఉదాహరణ ఫంక్షన్
function processEvent(event: T): ExtractEventPayload {
//నిజమైన అమలులో, మనం వాస్తవానికి ఈవెంట్ను డిస్పాచ్ చేస్తాము.
console.log(`ఈవెంట్ ప్రాసెస్ అవుతోంది ${event}`);
//నిజమైన అమలులో, పేలోడ్ ఈవెంట్ టైప్ ఆధారంగా ఉంటుంది.
return { type: event, payload: {} } as ExtractEventPayload;
}
//రిటర్న్ టైప్స్ చాలా నిర్దిష్టంగా ఉన్నాయని గమనించండి:
const clickEvent = processEvent("onClick"); // { type: "onClick"; payload: any; }
const mouseOverEvent = processEvent("onMouseOver"); // { type: "onMouseOver"; payload: any; }
//మీరు ఇతర స్ట్రింగ్లను ఉపయోగిస్తే, మీకు నెవర్ వస్తుంది:
// const someOtherEvent = processEvent("someOtherEvent"); // టైప్ `never`
ఉత్తమ పద్ధతులు మరియు పరిగణనలు
- సరళంగా ఉంచండి: శక్తివంతమైనప్పటికీ, ఈ అధునాతన టైప్స్ త్వరగా సంక్లిష్టంగా మారగలవు. స్పష్టత మరియు నిర్వహణ కోసం ప్రయత్నించండి.
- సమగ్రంగా పరీక్షించండి: సమగ్ర యూనిట్ పరీక్షలు రాయడం ద్వారా మీ టైప్ డెఫినిషన్లు ఆశించిన విధంగా ప్రవర్తిస్తాయని నిర్ధారించుకోండి.
- మీ కోడ్ను డాక్యుమెంట్ చేయండి: కోడ్ చదవడానికి వీలుగా మీ అధునాతన టైప్స్ యొక్క ఉద్దేశ్యం మరియు ప్రవర్తనను స్పష్టంగా డాక్యుమెంట్ చేయండి.
- పనితీరును పరిగణించండి: అధునాతన టైప్స్ యొక్క అధిక వినియోగం కంపైలేషన్ సమయాన్ని ప్రభావితం చేస్తుంది. మీ కోడ్ను ప్రొఫైల్ చేసి అవసరమైన చోట ఆప్టిమైజ్ చేయండి.
ముగింపు
టెంప్లేట్ లిటరల్ టైప్స్ మరియు కండిషనల్ టైప్స్ టైప్స్క్రిప్ట్ యొక్క ఆయుధశాలలో శక్తివంతమైన సాధనాలు. ఈ అధునాతన టైప్స్లో నైపుణ్యం సాధించడం ద్వారా, మీరు మరింత వ్యక్తీకరణ, నిర్వహించదగిన మరియు టైప్-సేఫ్ కోడ్ రాయవచ్చు. ఈ ఫీచర్లు టైప్స్ మధ్య సంక్లిష్ట సంబంధాలను సంగ్రహించడానికి, కఠినమైన పరిమితులను అమలు చేయడానికి మరియు అత్యంత పునర్వినియోగించదగిన టైప్ డెఫినిషన్లను సృష్టించడానికి మిమ్మల్ని అనుమతిస్తాయి. మీ టైప్స్క్రిప్ట్ నైపుణ్యాలను ఉన్నత స్థాయికి తీసుకెళ్లడానికి మరియు ప్రపంచ ప్రేక్షకులకు పటిష్టమైన మరియు స్కేలబుల్ అప్లికేషన్లను నిర్మించడానికి ఈ పద్ధతులను స్వీకరించండి.