अधिक प्रभावी आणि सुव्यवस्थित कोड लिहिण्यासाठी टेम्पलेट लिटरल्स आणि कंडिशनल टाइप्ससारख्या टाइपस्क्रिप्टच्या प्रगत वैशिष्ट्यांचा शोध घ्या. क्लिष्ट परिस्थितींसाठी टाइप मॅनिप्युलेशनमध्ये प्राविण्य मिळवा.
टाइपस्क्रिप्ट अॅडव्हान्स्ड टाइप्स: टेम्पलेट लिटरल्स आणि कंडिशनल टाइप्समध्ये प्राविण्य
टाइपस्क्रिप्टची शक्ती त्याच्या शक्तिशाली टाइप सिस्टममध्ये आहे. जरी 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" is not assignable to type "/users/GET" | "/users/POST" | "/users/PUT" | "/users/DELETE" | "/products/GET" | "/products/POST" | ... 3 more ... | "/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"; // त्रुटी: Type 'string' is not assignable to type '`${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; // टाइप StringCheck = true
type NumberCheck = IsString; // टाइप 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; // टाइप AddReturnType = number
या उदाहरणात, ReturnType एका फंक्शन टाइप T चा रिटर्न टाइप काढतो. कंडिशनल टाइपचा infer R भाग रिटर्न टाइपला इन्फर करतो आणि त्याला R टाइप व्हेरिएबलला नियुक्त करतो. जर T हा फंक्शन टाइप नसेल, तर टाइप any म्हणून रिझॉल्व्ह होतो.
डिस्ट्रिब्युटिव्ह कंडिशनल टाइप्स
जेव्हा तपासलेला टाइप एक नेकेड टाइप पॅरामीटर असतो तेव्हा कंडिशनल टाइप्स डिस्ट्रिब्युटिव्ह बनतात. याचा अर्थ असा की कंडिशनल टाइप युनियन टाइपच्या प्रत्येक सदस्यावर स्वतंत्रपणे लागू होतो.
type ToArray = T extends any ? T[] : never;
type NumberOrStringArray = ToArray; // टाइप 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("Invalid date format");
}
}
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(`Processing event ${event}`);
//खऱ्या इम्प्लिमेंटेशनमध्ये, पेलोड इव्हेंट टाइपवर आधारित असेल.
return { type: event, payload: {} } as ExtractEventPayload;
}
//लक्षात घ्या की रिटर्न टाइप्स खूप विशिष्ट आहेत:
const clickEvent = processEvent("onClick"); // { type: "onClick"; payload: any; }
const mouseOverEvent = processEvent("onMouseOver"); // { type: "onMouseOver"; payload: any; }
//जर तुम्ही इतर स्ट्रिंग्स वापरल्या, तर तुम्हाला never मिळेल:
// const someOtherEvent = processEvent("someOtherEvent"); // टाइप `never` आहे
सर्वोत्तम पद्धती आणि विचार
- सोपे ठेवा: शक्तिशाली असले तरी, हे प्रगत टाइप्स लवकरच क्लिष्ट होऊ शकतात. स्पष्टता आणि सुलभतेसाठी प्रयत्न करा.
- सखोल चाचणी करा: सर्वसमावेशक युनिट टेस्ट लिहून तुमच्या टाइप डेफिनिशन्स अपेक्षेप्रमाणे वागतात याची खात्री करा.
- तुमचा कोड डॉक्युमेंट करा: कोडची वाचनीयता सुधारण्यासाठी तुमच्या प्रगत टाइप्सचा उद्देश आणि वर्तन स्पष्टपणे डॉक्युमेंट करा.
- कार्यक्षमतेचा विचार करा: प्रगत टाइप्सच्या अतिवापरामुळे कंपाइलेशन वेळेवर परिणाम होऊ शकतो. तुमच्या कोडचे प्रोफाइल करा आणि आवश्यकतेनुसार ऑप्टिमाइझ करा.
निष्कर्ष
टेम्पलेट लिटरल्स आणि कंडिशनल टाइप्स टाइपस्क्रिप्टच्या शस्त्रागारातील शक्तिशाली साधने आहेत. या प्रगत टाइप्सवर प्रभुत्व मिळवून, तुम्ही अधिक अर्थपूर्ण, सुलभ आणि टाइप-सेफ कोड लिहू शकता. ही वैशिष्ट्ये तुम्हाला टाइप्समधील जटिल संबंध कॅप्चर करण्यास, कठोर मर्यादा लागू करण्यास आणि अत्यंत पुन्हा वापरण्यायोग्य टाइप डेफिनिशन्स तयार करण्यास सक्षम करतात. तुमचे टाइपस्क्रिप्ट कौशल्य वाढवण्यासाठी आणि जागतिक प्रेक्षकांसाठी मजबूत आणि स्केलेबल ॲप्लिकेशन्स तयार करण्यासाठी या तंत्रांचा स्वीकार करा.