தமிழ்

டைப்ஸ்கிரிப்ட் டெம்ப்ளேட் லிட்டரல் வகைகளை ஆராய்ந்து, மிகவும் பாதுகாப்பான மற்றும் பராமரிக்கக்கூடிய ஏபிஐ-களை உருவாக்க அவை எவ்வாறு பயன்படுகின்றன என்பதையும், அதன் மூலம் குறியீட்டின் தரம் மற்றும் டெவலப்பர் அனுபவத்தை மேம்படுத்துவதையும் கண்டறியுங்கள்.

பாதுகாப்பான ஏபிஐ-களுக்கான டைப்ஸ்கிரிப்ட் டெம்ப்ளேட் லிட்டரல் வகைகள்

டைப்ஸ்கிரிப்ட் டெம்ப்ளேட் லிட்டரல் வகைகள் என்பது டைப்ஸ்கிரிப்ட் 4.1-ல் அறிமுகப்படுத்தப்பட்ட ஒரு சக்திவாய்ந்த அம்சமாகும், இது வகை மட்டத்தில் (type level) ஸ்டிரிங் கையாளுதலைச் செய்ய உங்களை அனுமதிக்கிறது. இது மிகவும் பாதுகாப்பான மற்றும் பராமரிக்கக்கூடிய ஏபிஐ-களை உருவாக்குவதற்கான பல சாத்தியக்கூறுகளைத் திறக்கிறது, ரன்டைமில் மட்டுமே வெளிப்படும் பிழைகளை கம்பைல் நேரத்திலேயே கண்டறிய உதவுகிறது. இது, மேம்பட்ட டெவலப்பர் அனுபவம், எளிதான ரீஃபாக்டரிங் மற்றும் மேலும் உறுதியான குறியீட்டிற்கு வழிவகுக்கிறது.

டெம்ப்ளேட் லிட்டரல் வகைகள் என்றால் என்ன?

அடிப்படையில், டெம்ப்ளேட் லிட்டரல் வகைகள் என்பது ஸ்டிரிங் லிட்டரல் வகைகளாகும், அவை ஸ்டிரிங் லிட்டரல் வகைகள், யூனியன் வகைகள் மற்றும் டைப் மாறிகளை (type variables) இணைத்து உருவாக்கப்படலாம். இவற்றை வகைகளுக்கான ஸ்டிரிங் இன்டர்போலேஷன் (string interpolation for types) என்று கருதலாம். இது ஏற்கனவே உள்ள வகைகளின் அடிப்படையில் புதிய வகைகளை உருவாக்க உங்களை அனுமதிக்கிறது, இது அதிக நெகிழ்வுத்தன்மையையும் வெளிப்பாட்டுத்தன்மையையும் வழங்குகிறது.

இதோ ஒரு எளிய உதாரணம்:

type Greeting = "Hello, World!";

type PersonalizedGreeting<T extends string> = `Hello, ${T}!`;

type MyGreeting = PersonalizedGreeting<"Alice">; // வகை MyGreeting = "Hello, Alice!"

இந்த எடுத்துக்காட்டில், PersonalizedGreeting என்பது ஒரு டெம்ப்ளேட் லிட்டரல் வகையாகும், இது ஒரு ஜெனரிக் வகை பாராமீட்டரான T-ஐ எடுத்துக்கொள்கிறது, அது ஒரு ஸ்டிரிங்காக இருக்க வேண்டும். பின்னர் அது "Hello, " என்ற ஸ்டிரிங் லிட்டரலை T-யின் மதிப்புடனும் "!" என்ற ஸ்டிரிங் லிட்டரலுடனும் இன்டர்போலேட் செய்து ஒரு புதிய வகையை உருவாக்குகிறது. இதன் விளைவாக வரும் MyGreeting வகை, "Hello, Alice!" ஆகும்.

டெம்ப்ளேட் லிட்டரல் வகைகளைப் பயன்படுத்துவதன் நன்மைகள்

நிஜ உலக பயன்பாட்டு வழக்குகள்

1. ஏபிஐ எண்ட்பாயிண்ட் வரையறை

ஏபிஐ எண்ட்பாயிண்ட் வகைகளை வரையறுக்க டெம்ப்ளேட் லிட்டரல் வகைகள் பயன்படுத்தப்படலாம், இது சரியான பாராமீட்டர்கள் ஏபிஐ-க்கு அனுப்பப்படுவதையும், ரெஸ்பான்ஸ் சரியாக கையாளப்படுவதையும் உறுதி செய்கிறது. USD, EUR, மற்றும் JPY போன்ற பல கரன்சிகளை ஆதரிக்கும் ஒரு இ-காமர்ஸ் தளத்தை கருத்தில் கொள்ளுங்கள்.

type Currency = "USD" | "EUR" | "JPY";
type ProductID = string; // நடைமுறையில், இது ஒரு குறிப்பிட்ட வகையாக இருக்கலாம்

type GetProductEndpoint<C extends Currency> = `/products/${ProductID}/${C}`;

type USDEndpoint = GetProductEndpoint<"USD">; // வகை USDEndpoint = "/products/${string}/USD"

இந்த எடுத்துக்காட்டு ஒரு GetProductEndpoint வகையை வரையறுக்கிறது, இது ஒரு கரன்சியை வகை பாராமீட்டராக எடுத்துக்கொள்கிறது. இதன் விளைவாக வரும் வகை, குறிப்பிட்ட கரன்சியில் ஒரு பொருளைப் பெறுவதற்கான ஏபிஐ எண்ட்பாயிண்ட்டைக் குறிக்கும் ஒரு ஸ்டிரிங் லிட்டரல் வகையாகும். இந்த முறையைப் பயன்படுத்தி, ஏபிஐ எண்ட்பாயிண்ட் எப்போதும் சரியாக கட்டமைக்கப்படுவதையும், சரியான கரன்சி பயன்படுத்தப்படுவதையும் நீங்கள் உறுதிசெய்யலாம்.

2. தரவு சரிபார்ப்பு

கம்பைல் நேரத்தில் தரவைச் சரிபார்க்க டெம்ப்ளேட் லிட்டரல் வகைகள் பயன்படுத்தப்படலாம். உதாரணமாக, தொலைபேசி எண் அல்லது மின்னஞ்சல் முகவரியின் வடிவத்தைச் சரிபார்க்க அவற்றைப் பயன்படுத்தலாம். நாட்டு குறியீட்டைப் (country code) பொறுத்து வெவ்வேறு வடிவங்களைக் கொண்ட சர்வதேச தொலைபேசி எண்களை நீங்கள் சரிபார்க்க வேண்டும் என்று கற்பனை செய்து பாருங்கள்.

type CountryCode = "+1" | "+44" | "+81"; // US, UK, Japan
type PhoneNumber<C extends CountryCode, N extends string> = `${C}-${N}`;

type ValidUSPhoneNumber = PhoneNumber<"+1", "555-123-4567">; // வகை ValidUSPhoneNumber = "+1-555-123-4567"

//குறிப்பு: மேலும் சிக்கலான சரிபார்ப்புகளுக்கு டெம்ப்ளேட் லிட்டரல் வகைகளை நிபந்தனை வகைகளுடன் இணைக்க வேண்டியிருக்கலாம்.

இந்த எடுத்துக்காட்டு, ஒரு குறிப்பிட்ட வடிவத்தை அமல்படுத்தும் ஒரு அடிப்படை தொலைபேசி எண் வகையை நீங்கள் எவ்வாறு உருவாக்கலாம் என்பதைக் காட்டுகிறது. மேலும் நுட்பமான சரிபார்ப்புகளில் நிபந்தனை வகைகள் மற்றும் டெம்ப்ளேட் லிட்டரலுக்குள் ரெகுலர் எக்ஸ்பிரஷன் போன்ற பேட்டர்ன்களைப் பயன்படுத்துவது அடங்கும்.

3. குறியீடு உருவாக்கம்

கம்பைல் நேரத்தில் குறியீட்டை உருவாக்க டெம்ப்ளேட் லிட்டரல் வகைகள் பயன்படுத்தப்படலாம். உதாரணமாக, அவை காண்பிக்கும் தரவின் பெயரை அடிப்படையாகக் கொண்டு ரியாக்ட் காம்போனென்ட் பெயர்களை உருவாக்க அவற்றைப் பயன்படுத்தலாம். <Entity>Details பேட்டர்னைப் பின்பற்றி காம்போனென்ட் பெயர்களை உருவாக்குவது ஒரு பொதுவான முறையாகும்.

type Entity = "User" | "Product" | "Order";
type ComponentName<E extends Entity> = `${E}Details`;

type UserDetailsComponent = ComponentName<"User">; // வகை UserDetailsComponent = "UserDetails"

இது தானாகவே சீரான மற்றும் விளக்கமான காம்போனென்ட் பெயர்களை உருவாக்க உங்களை அனுமதிக்கிறது, பெயரிடல் முரண்பாடுகளின் அபாயத்தைக் குறைத்து, குறியீட்டின் வாசிப்புத்தன்மையை மேம்படுத்துகிறது.

4. நிகழ்வு கையாளுதல் (Event Handling)

நிகழ்வு பெயர்களை (event names) வகை-பாதுகாப்பான முறையில் வரையறுப்பதற்கு டெம்ப்ளேட் லிட்டரல் வகைகள் சிறந்தவை, இது நிகழ்வு கேட்பவர்கள் (event listeners) சரியாக பதிவு செய்யப்படுவதையும், நிகழ்வு கையாளுபவர்கள் (event handlers) எதிர்பார்க்கப்படும் தரவைப் பெறுவதையும் உறுதி செய்கிறது. ஒரு கணினியில் நிகழ்வுகள் மாட்யூல் மற்றும் நிகழ்வு வகையின்படி வகைப்படுத்தப்பட்டு, ஒரு பெருங்குடல் புள்ளியால் (colon) பிரிக்கப்படுகின்றன என்று கருதுங்கள்.

type Module = "user" | "product" | "order";
type EventType = "created" | "updated" | "deleted";
type EventName<M extends Module, E extends EventType> = `${M}:${E}`;

type UserCreatedEvent = EventName<"user", "created">; // வகை UserCreatedEvent = "user:created"

interface EventMap {
  [key: EventName<Module, EventType>]: (data: any) => void; // உதாரணம்: நிகழ்வு கையாளுதலுக்கான வகை
}

இந்த எடுத்துக்காட்டு, ஒரு சீரான பேட்டர்னைப் பின்பற்றும் நிகழ்வு பெயர்களை எவ்வாறு உருவாக்குவது என்பதைக் காட்டுகிறது, இது நிகழ்வு அமைப்பின் ஒட்டுமொத்த கட்டமைப்பு மற்றும் வகை பாதுகாப்பை மேம்படுத்துகிறது.

மேம்பட்ட நுட்பங்கள்

1. நிபந்தனை வகைகளுடன் இணைத்தல்

டெம்ப்ளேட் லிட்டரல் வகைகளை நிபந்தனை வகைகளுடன் (conditional types) இணைத்து இன்னும் அதிநவீன வகை மாற்றங்களை உருவாக்கலாம். நிபந்தனை வகைகள் மற்ற வகைகளைச் சார்ந்து இருக்கும் வகைகளை வரையறுக்க உங்களை அனுமதிக்கின்றன, இது வகை மட்டத்தில் சிக்கலான தர்க்கத்தைச் செய்ய உதவுகிறது.

type ToUpperCase<S extends string> = S extends Uppercase<S> ? S : Uppercase<S>;

type MaybeUpperCase<S extends string, Upper extends boolean> = Upper extends true ? ToUpperCase<S> : S;

type Example = MaybeUpperCase<"hello", true>; // வகை Example = "HELLO"
type Example2 = MaybeUpperCase<"world", false>; // வகை Example2 = "world"

இந்த எடுத்துக்காட்டில், MaybeUpperCase ஒரு ஸ்டிரிங் மற்றும் ஒரு பூலியனை எடுத்துக்கொள்கிறது. பூலியன் உண்மையாக இருந்தால், அது ஸ்டிரிங்கை பெரிய எழுத்துக்களுக்கு மாற்றுகிறது; இல்லையெனில், அது ஸ்டிரிங்கை அப்படியே திருப்பியனுப்புகிறது. இது ஸ்டிரிங் வகைகளை நிபந்தனையுடன் எவ்வாறு மாற்றலாம் என்பதைக் காட்டுகிறது.

2. மேப் செய்யப்பட்ட வகைகளுடன் பயன்படுத்துதல்

ஒரு ஆப்ஜெக்ட் வகையின் கீ-களை (keys) மாற்றுவதற்கு டெம்ப்ளேட் லிட்டரல் வகைகளை மேப் செய்யப்பட்ட வகைகளுடன் (mapped types) பயன்படுத்தலாம். மேப் செய்யப்பட்ட வகைகள், ஏற்கனவே உள்ள ஒரு வகையின் கீ-களை ஒவ்வொன்றாக எடுத்து, ஒவ்வொரு கீ-க்கும் ஒரு மாற்றத்தைப் பயன்படுத்துவதன் மூலம் புதிய வகைகளை உருவாக்க உங்களை அனுமதிக்கின்றன. ஆப்ஜெக்ட் கீ-களுக்கு ஒரு முன்னொட்டு (prefix) அல்லது பின்னொட்டு (suffix) சேர்ப்பது ஒரு பொதுவான பயன்பாட்டு வழக்காகும்.

type MyObject = {
  name: string;
  age: number;
};

type AddPrefix<T, Prefix extends string> = {
  [K in keyof T as `${Prefix}${string & K}`]: T[K];
};

type PrefixedObject = AddPrefix<MyObject, "data_">;
// வகை PrefixedObject = {
//    data_name: string;
//    data_age: number;
// }

இங்கே, AddPrefix ஒரு ஆப்ஜெக்ட் வகை மற்றும் ஒரு முன்னொட்டை எடுத்துக்கொள்கிறது. பின்னர் அது அதே பண்புகளுடன் ஒரு புதிய ஆப்ஜெக்ட் வகையை உருவாக்குகிறது, ஆனால் ஒவ்வொரு கீ-க்கும் முன்னொட்டு சேர்க்கப்பட்டுள்ளது. இது டேட்டா டிரான்ஸ்ஃபர் ஆப்ஜெக்ட்களை (DTOs) அல்லது பண்புகளின் பெயர்களை மாற்ற வேண்டிய பிற வகைளை உருவாக்க பயனுள்ளதாக இருக்கும்.

3. உள்ளார்ந்த ஸ்டிரிங் கையாளுதல் வகைகள்

டைப்ஸ்கிரிப்ட் Uppercase, Lowercase, Capitalize, மற்றும் Uncapitalize போன்ற பல உள்ளார்ந்த ஸ்டிரிங் கையாளுதல் வகைகளை வழங்குகிறது, இவற்றை டெம்ப்ளேட் லிட்டரல் வகைகளுடன் இணைந்து மேலும் சிக்கலான ஸ்டிரிங் மாற்றங்களைச் செய்யப் பயன்படுத்தலாம்.

type MyString = "hello world";

type CapitalizedString = Capitalize<MyString>; // வகை CapitalizedString = "Hello world"

type UpperCasedString = Uppercase<MyString>;   // வகை UpperCasedString = "HELLO WORLD"

இந்த உள்ளார்ந்த வகைகள், தனிப்பயன் வகை தர்க்கத்தை எழுதாமல் பொதுவான ஸ்டிரிங் கையாளுதல்களைச் செய்வதை எளிதாக்குகின்றன.

சிறந்த நடைமுறைகள்

பொதுவான ஆபத்துகள்

மாற்று வழிகள்

ஏபிஐ உருவாக்கத்தில் வகை பாதுகாப்பை அடைய டெம்ப்ளேட் லிட்டரல் வகைகள் ஒரு சக்திவாய்ந்த வழியை வழங்கினாலும், சில சூழ்நிலைகளில் மிகவும் பொருத்தமானதாக இருக்கும் மாற்று அணுகுமுறைகளும் உள்ளன.

முடிவுரை

டைப்ஸ்கிரிப்ட் டெம்ப்ளேட் லிட்டரல் வகைகள் வகை-பாதுகாப்பான மற்றும் பராமரிக்கக்கூடிய ஏபிஐ-களை உருவாக்குவதற்கான ஒரு மதிப்புமிக்க கருவியாகும். அவை வகை மட்டத்தில் ஸ்டிரிங் கையாளுதலைச் செய்ய உங்களை அனுமதிக்கின்றன, கம்பைல் நேரத்தில் பிழைகளைக் கண்டறியவும், உங்கள் குறியீட்டின் ஒட்டுமொத்த தரத்தை மேம்படுத்தவும் உதவுகின்றன. இந்த கட்டுரையில் விவாதிக்கப்பட்ட கருத்துக்கள் மற்றும் நுட்பங்களைப் புரிந்துகொள்வதன் மூலம், நீங்கள் டெம்ப்ளேட் லிட்டரல் வகைகளைப் பயன்படுத்தி மேலும் உறுதியான, நம்பகமான மற்றும் டெவலப்பர்-நட்பு ஏபிஐ-களை உருவாக்கலாம். நீங்கள் ஒரு சிக்கலான வலைப் பயன்பாட்டை உருவாக்கினாலும் அல்லது ஒரு எளிய கட்டளை-வரி கருவியை உருவாக்கினாலும், டெம்ப்ளேட் லிட்டரல் வகைகள் சிறந்த டைப்ஸ்கிரிப்ட் குறியீட்டை எழுத உங்களுக்கு உதவும்.

மேலும் எடுத்துக்காட்டுகளை ஆராய்ந்து, உங்கள் சொந்த திட்டங்களில் டெம்ப்ளேட் லிட்டரல் வகைகளுடன் பரிசோதனை செய்து அவற்றின் முழு திறனையும் புரிந்துகொள்ளுங்கள். நீங்கள் அவற்றை எவ்வளவு அதிகமாகப் பயன்படுத்துகிறீர்களோ, அவ்வளவு அதிகமாக அவற்றின் தொடரியல் மற்றும் திறன்களுடன் நீங்கள் பழகுவீர்கள், இது உண்மையான வகை-பாதுகாப்பான மற்றும் உறுதியான பயன்பாடுகளை உருவாக்க உங்களை அனுமதிக்கும்.