தமிழ்

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

டைப்ஸ்கிரிப்ட் பிராண்டட் டைப்ஸ்: ஒரு கட்டமைப்பு அமைப்பில் பெயரளவிலான டைப்பிங்

டைப்ஸ்கிரிப்ட்டின் கட்டமைப்பு வகை அமைப்பு (structural type system) நெகிழ்வுத்தன்மையை வழங்குகிறது, ஆனால் சில நேரங்களில் எதிர்பாராத நடத்தைக்கு வழிவகுக்கும். பிராண்டட் டைப்ஸ், பெயரளவிலான டைப்பிங்கை (nominal typing) செயல்படுத்த ஒரு வழியை வழங்குகிறது, இது டைப் பாதுகாப்பு மற்றும் குறியீட்டுத் தெளிவை மேம்படுத்துகிறது. இந்தக் கட்டுரை பிராண்டட் டைப்ஸ்களை விரிவாக ஆராய்கிறது, மேலும் அவற்றின் செயல்படுத்தலுக்கான நடைமுறை எடுத்துக்காட்டுகள் மற்றும் சிறந்த நடைமுறைகளை வழங்குகிறது.

கட்டமைப்பு மற்றும் பெயரளவிலான டைப்பிங்கை புரிந்துகொள்ளுதல்

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

கட்டமைப்பு டைப்பிங் (டக் டைப்பிங்)

ஒரு கட்டமைப்பு வகை அமைப்பில், இரண்டு டைப்கள் ஒரே கட்டமைப்பைக் கொண்டிருந்தால் (அதாவது, ஒரே பண்புகளை ஒரே டைப்களுடன் கொண்டிருந்தால்) அவை இணக்கமானதாகக் கருதப்படும். டைப்ஸ்கிரிப்ட் கட்டமைப்பு டைப்பிங்கைப் பயன்படுத்துகிறது. இந்த உதாரணத்தைக் கவனியுங்கள்:


interface Point {
  x: number;
  y: number;
}

interface Vector {
  x: number;
  y: number;
}

const point: Point = { x: 10, y: 20 };
const vector: Vector = point; // Valid in TypeScript

console.log(vector.x); // Output: 10

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

பெயரளவிலான டைப்பிங்

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

பிராண்டட் டைப்ஸ்களின் தேவை

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

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

டைப்ஸ்கிரிப்டில் பிராண்டட் டைப்ஸ்களை செயல்படுத்துதல்

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

சிம்பல்களைப் பயன்படுத்துதல் (பரிந்துரைக்கப்படுகிறது)

சிம்பல்கள் தனித்துவமானவை என்று உத்தரவாதம் அளிக்கப்படுவதால், பிராண்டிங்கிற்கு சிம்பல்களைப் பயன்படுத்துவது பொதுவாக விரும்பப்படுகிறது.


const USD = Symbol('USD');
type USD = number & { readonly [USD]: unique symbol };

const EUR = Symbol('EUR');
type EUR = number & { readonly [EUR]: unique symbol };

function createUSD(value: number): USD {
  return value as USD;
}

function createEUR(value: number): EUR {
  return value as EUR;
}

function addUSD(a: USD, b: USD): USD {
  return (a + b) as USD;
}

const usd1 = createUSD(10);
const usd2 = createUSD(20);
const eur1 = createEUR(15);

const totalUSD = addUSD(usd1, usd2);
console.log("Total USD:", totalUSD);

// Uncommenting the next line will cause a type error
// const invalidOperation = addUSD(usd1, eur1);

இந்த எடுத்துக்காட்டில், USD மற்றும் EUR ஆகியவை number டைப்பை அடிப்படையாகக் கொண்ட பிராண்டட் டைப்ஸ் ஆகும். unique symbol இந்த டைப்கள் தனித்துவமானவை என்பதை உறுதி செய்கிறது. இந்த டைப்களின் மதிப்புகளை உருவாக்க createUSD மற்றும் createEUR செயல்பாடுகள் பயன்படுத்தப்படுகின்றன, மேலும் addUSD செயல்பாடு USD மதிப்புகளை மட்டுமே ஏற்றுக்கொள்கிறது. ஒரு EUR மதிப்பை ஒரு USD மதிப்புடன் சேர்க்க முயற்சிப்பது ஒரு டைப் பிழையை ஏற்படுத்தும்.

ஸ்டிரிங் லிட்டரல்களைப் பயன்படுத்துதல்

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


type USD = number & { readonly __brand: 'USD' };
type EUR = number & { readonly __brand: 'EUR' };

function createUSD(value: number): USD {
  return value as USD;
}

function createEUR(value: number): EUR {
  return value as EUR;
}

function addUSD(a: USD, b: USD): USD {
  return (a + b) as USD;
}

const usd1 = createUSD(10);
const usd2 = createUSD(20);
const eur1 = createEUR(15);

const totalUSD = addUSD(usd1, usd2);
console.log("Total USD:", totalUSD);

// Uncommenting the next line will cause a type error
// const invalidOperation = addUSD(usd1, eur1);

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

நடைமுறை எடுத்துக்காட்டுகள் மற்றும் பயன்பாட்டு வழக்குகள்

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

ID-க்கள்

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


const UserIDBrand = Symbol('UserID');
type UserID = string & { readonly [UserIDBrand]: unique symbol };

const ProductIDBrand = Symbol('ProductID');
type ProductID = string & { readonly [ProductIDBrand]: unique symbol };

function getUser(id: UserID): { name: string } {
  // ... fetch user data
  return { name: "Alice" };
}

function getProduct(id: ProductID): { name: string, price: number } {
  // ... fetch product data
  return { name: "Example Product", price: 25 };
}

function createUserID(id: string): UserID {
  return id as UserID;
}

function createProductID(id: string): ProductID {
  return id as ProductID;
}

const userID = createUserID('user123');
const productID = createProductID('product456');

const user = getUser(userID);
const product = getProduct(productID);

console.log("User:", user);
console.log("Product:", product);

// Uncommenting the next line will cause a type error
// const invalidCall = getUser(productID);

இந்த எடுத்துக்காட்டு, ஒரு UserID-ஐ எதிர்பார்க்கும் ஒரு செயல்பாட்டிற்கு ஒரு ProductID-ஐ அனுப்புவதை பிராண்டட் டைப்ஸ் எவ்வாறு தடுக்க முடியும் என்பதைக் காட்டுகிறது, இது டைப் பாதுகாப்பை மேம்படுத்துகிறது.

கள-குறிப்பிட்ட மதிப்புகள்

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


const PercentageBrand = Symbol('Percentage');
type Percentage = number & { readonly [PercentageBrand]: unique symbol };

function createPercentage(value: number): Percentage {
  if (value < 0 || value > 100) {
    throw new Error('Percentage must be between 0 and 100');
  }
  return value as Percentage;
}

function applyDiscount(price: number, discount: Percentage): number {
  return price * (1 - discount / 100);
}

try {
  const discount = createPercentage(20);
  const discountedPrice = applyDiscount(100, discount);
  console.log("Discounted Price:", discountedPrice);

  // Uncommenting the next line will cause an error during runtime
  // const invalidPercentage = createPercentage(120);
} catch (error) {
  console.error(error);
}

இந்த எடுத்துக்காட்டு, ஒரு பிராண்டட் டைப்பின் மதிப்பின் மீது ஒரு கட்டுப்பாட்டை ரன்டைமில் எவ்வாறு செயல்படுத்துவது என்பதைக் காட்டுகிறது. ஒரு Percentage மதிப்பு எப்போதும் 0 மற்றும் 100 க்கு இடையில் இருக்கும் என்று டைப் அமைப்பு உத்தரவாதம் அளிக்க முடியாது என்றாலும், createPercentage செயல்பாடு இந்தக் கட்டுப்பாட்டை ரன்டைமில் செயல்படுத்த முடியும். பிராண்டட் டைப்ஸ்களின் ரன்டைம் சரிபார்ப்பைச் செயல்படுத்த நீங்கள் io-ts போன்ற லைப்ரரிகளையும் பயன்படுத்தலாம்.

தேதி மற்றும் நேரப் பிரதிநிதித்துவங்கள்

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


const UTCDateBrand = Symbol('UTCDate');
type UTCDate = string & { readonly [UTCDateBrand]: unique symbol };

const LocalDateBrand = Symbol('LocalDate');
type LocalDate = string & { readonly [LocalDateBrand]: unique symbol };

function createUTCDate(dateString: string): UTCDate {
  // Validate that the date string is in UTC format (e.g., ISO 8601 with Z)
  if (!/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/.test(dateString)) {
    throw new Error('Invalid UTC date format');
  }
  return dateString as UTCDate;
}

function createLocalDate(dateString: string): LocalDate {
  // Validate that the date string is in local date format (e.g., YYYY-MM-DD)
  if (!/\d{4}-\d{2}-\d{2}/.test(dateString)) {
    throw new Error('Invalid local date format');
  }
  return dateString as LocalDate;
}

function convertUTCDateToLocalDate(utcDate: UTCDate): LocalDate {
  // Perform time zone conversion
  const date = new Date(utcDate);
  const localDateString = date.toLocaleDateString();
  return createLocalDate(localDateString);
}

try {
  const utcDate = createUTCDate('2024-01-20T10:00:00.000Z');
  const localDate = convertUTCDateToLocalDate(utcDate);
  console.log("UTC Date:", utcDate);
  console.log("Local Date:", localDate);
} catch (error) {
  console.error(error);
}

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

பிராண்டட் டைப்ஸ்களைப் பயன்படுத்துவதற்கான சிறந்த நடைமுறைகள்

டைப்ஸ்கிரிப்டில் பிராண்டட் டைப்ஸ்களை திறம்பட பயன்படுத்த, பின்வரும் சிறந்த நடைமுறைகளைக் கவனியுங்கள்:

பிராண்டட் டைப்ஸ்களின் நன்மைகள்

பிராண்டட் டைப்ஸ்களின் தீமைகள்

பிராண்டட் டைப்ஸ்களுக்கான மாற்று வழிகள்

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

ஒபேக் டைப்ஸ் (Opaque Types)

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

கிளாஸ்கள் (Classes)

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

`io-ts` அல்லது `zod` போன்ற லைப்ரரிகள்

இந்த லைப்ரரிகள் அதிநவீன ரன்டைம் டைப் சரிபார்ப்பை வழங்குகின்றன மற்றும் கம்பைல்-டைம் மற்றும் ரன்டைம் பாதுகாப்பு இரண்டையும் உறுதிப்படுத்த பிராண்டட் டைப்ஸ்களுடன் இணைக்கப்படலாம்.

முடிவுரை

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

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

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