டெம்ப்ளேட் லிட்டரல் மற்றும் நிபந்தனை வகைகள் போன்ற மேம்பட்ட டைப்ஸ்கிரிப்ட் அம்சங்களை ஆராய்ந்து, மிகவும் வெளிப்படையான மற்றும் பராமரிக்கக்கூடிய குறியீட்டை எழுதுங்கள். சிக்கலான சூழ்நிலைகளுக்கு வகை கையாளுதலில் தேர்ச்சி பெறுங்கள்.
டைப்ஸ்கிரிப்ட் மேம்பட்ட வகைகள்: டெம்ப்ளேட் லிட்டரல் மற்றும் நிபந்தனை வகைகளில் தேர்ச்சி பெறுதல்
டைப்ஸ்கிரிப்ட்டின் வலிமை அதன் சக்திவாய்ந்த வகை அமைப்பில் உள்ளது. பல சூழ்நிலைகளுக்கு string, number, மற்றும் boolean போன்ற அடிப்படை வகைகள் போதுமானதாக இருந்தாலும், டெம்ப்ளேட் லிட்டரல் வகைகள் மற்றும் நிபந்தனை வகைகள் போன்ற மேம்பட்ட அம்சங்கள் ஒரு புதிய அளவிலான வெளிப்பாட்டுத்தன்மையையும் வகை பாதுகாப்பையும் வழங்குகின்றன. இந்த வழிகாட்டி இந்த மேம்பட்ட வகைகளின் விரிவான கண்ணோட்டத்தை வழங்குகிறது, அவற்றின் திறன்களை ஆராய்ந்து நடைமுறை பயன்பாடுகளை விளக்குகிறது.
டெம்ப்ளேட் லிட்டரல் வகைகளைப் புரிந்துகொள்ளுதல்
டெம்ப்ளேட் லிட்டரல் வகைகள் ஜாவாஸ்கிரிப்ட்டின் டெம்ப்ளேட் லிட்டரல்களை அடிப்படையாகக் கொண்டு, சரம் இடைக்கணிப்பின் (string interpolation) அடிப்படையில் வகைகளை வரையறுக்க உங்களை அனுமதிக்கின்றன. இது குறிப்பிட்ட சரம் வடிவங்களைக் குறிக்கும் வகைகளை உருவாக்க உதவுகிறது, உங்கள் குறியீட்டை மேலும் வலுவானதாகவும் கணிக்கக்கூடியதாகவும் மாற்றுகிறது.
அடிப்படை தொடரியல் மற்றும் பயன்பாடு
டெம்ப்ளேட் லிட்டரல் வகைகள், ஜாவாஸ்கிரிப்ட் டெம்ப்ளேட் லிட்டரல்களைப் போலவே, வகை வரையறையை இணைக்க பின்குறிப்புகளை (`) பயன்படுத்துகின்றன. பின்குறிப்புகளுக்குள், ${} தொடரியலைப் பயன்படுத்தி மற்ற வகைகளை இடைக்கணிப்பு செய்யலாம். இங்குதான் அற்புதம் நிகழ்கிறது - நீங்கள் அடிப்படையில் ஒரு சரமாக இருக்கும் ஒரு வகையை உருவாக்குகிறீர்கள், இது தொகுக்கும் நேரத்தில் (compile time) இடைக்கணிப்புக்குள் இருக்கும் வகைகளின் அடிப்படையில் கட்டமைக்கப்படுகிறது.
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("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; }
//நீங்கள் மற்ற சரங்களைப் பயன்படுத்தினால், நீங்கள் ஒருபோதும் பெறமாட்டீர்கள்:
// const someOtherEvent = processEvent("someOtherEvent"); // வகை `never`
சிறந்த நடைமுறைகள் மற்றும் பரிசீலனைகள்
- எளிமையாக வைத்திருங்கள்: சக்திவாய்ந்ததாக இருந்தாலும், இந்த மேம்பட்ட வகைகள் விரைவாக சிக்கலாகிவிடும். தெளிவு மற்றும் பராமரிக்கத்தக்க தன்மைக்காக பாடுபடுங்கள்.
- முழுமையாக சோதிக்கவும்: விரிவான யூனிட் சோதனைகளை எழுதுவதன் மூலம் உங்கள் வகை வரையறைகள் எதிர்பார்த்தபடி செயல்படுகின்றன என்பதை உறுதிப்படுத்தவும்.
- உங்கள் குறியீட்டை ஆவணப்படுத்தவும்: குறியீடு வாசிப்பை மேம்படுத்த உங்கள் மேம்பட்ட வகைகளின் நோக்கம் மற்றும் நடத்தையை தெளிவாக ஆவணப்படுத்தவும்.
- செயல்திறனைக் கவனியுங்கள்: மேம்பட்ட வகைகளின் அதிகப்படியான பயன்பாடு தொகுக்கும் நேரத்தை பாதிக்கலாம். உங்கள் குறியீட்டை சுயவிவரப்படுத்தி, தேவைப்படும் இடங்களில் மேம்படுத்தவும்.
முடிவுரை
டெம்ப்ளேட் லிட்டரல் வகைகள் மற்றும் நிபந்தனை வகைகள் ஆகியவை டைப்ஸ்கிரிப்ட்டின் ஆயுதக் களஞ்சியத்தில் சக்திவாய்ந்த கருவிகளாகும். இந்த மேம்பட்ட வகைகளில் தேர்ச்சி பெறுவதன் மூலம், நீங்கள் மேலும் வெளிப்படையான, பராமரிக்கக்கூடிய மற்றும் வகை-பாதுகாப்பான குறியீட்டை எழுதலாம். இந்த அம்சங்கள் வகைகளுக்கு இடையிலான சிக்கலான உறவுகளைப் பிடிக்கவும், கடுமையான கட்டுப்பாடுகளைச் செயல்படுத்தவும், மற்றும் மிகவும் மீண்டும் பயன்படுத்தக்கூடிய வகை வரையறைகளை உருவாக்கவும் உங்களுக்கு உதவுகின்றன. உங்கள் டைப்ஸ்கிரிப்ட் திறன்களை உயர்த்தவும், உலகளாவிய பார்வையாளர்களுக்காக வலுவான மற்றும் அளவிடக்கூடிய பயன்பாடுகளை உருவாக்கவும் இந்த நுட்பங்களைத் தழுவுங்கள்.