தமிழ்

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

டைப்ஸ்கிரிப்ட் Readonly வகைகள்: மாற்றமுடியாத தரவு கட்டமைப்புகளில் தேர்ச்சி பெறுதல்

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

மாற்றமுடியாத தன்மை (Immutability) என்றால் என்ன, அது ஏன் முக்கியமானது?

மாற்றமுடியாத தன்மை என்பது, அதன் மையத்தில், ஒரு பொருள் (object) உருவாக்கப்பட்டவுடன், அதன் நிலையை மாற்ற முடியாது என்பதாகும். இந்த எளிய கருத்து குறியீட்டின் தரம் மற்றும் பராமரிப்புத்திறனில் ஆழமான தாக்கங்களைக் கொண்டுள்ளது.

டைப்ஸ்கிரிப்ட்டில் Readonly வகைகள்: உங்கள் மாற்றமுடியாத தன்மைக்கான ஆயுதங்கள்

டைப்ஸ்கிரிப்ட் readonly என்ற முக்கிய சொல்லைப் பயன்படுத்தி மாற்றமுடியாத தன்மையைச் செயல்படுத்த பல வழிகளை வழங்குகிறது. வெவ்வேறு நுட்பங்களையும் அவை நடைமுறையில் எவ்வாறு பயன்படுத்தப்படலாம் என்பதையும் ஆராய்வோம்.

1. Interfaces மற்றும் Types-களில் Readonly பண்புகள்

ஒரு பண்பை readonly ஆக அறிவிப்பதற்கான மிகவும் நேரடியான வழி, ஒரு interface அல்லது type வரையறையில் நேரடியாக readonly என்ற முக்கிய சொல்லைப் பயன்படுத்துவதாகும்.


interface Person {
  readonly id: string;
  name: string;
  age: number;
}

const person: Person = {
  id: "unique-id-123",
  name: "Alice",
  age: 30,
};

// person.id = "new-id"; // பிழை: 'id' என்பது ஒரு read-only பண்பு என்பதால் அதற்கு ஒதுக்க முடியாது.
person.name = "Bob"; // இது அனுமதிக்கப்படுகிறது

இந்த எடுத்துக்காட்டில், id பண்பு readonly என அறிவிக்கப்பட்டுள்ளது. பொருள் உருவாக்கப்பட்ட பிறகு அதை மாற்றியமைக்கும் எந்தவொரு முயற்சியையும் டைப்ஸ்கிரிப்ட் தடுக்கும். readonly மாற்றியமைப்பான் இல்லாத name மற்றும் age பண்புகளை சுதந்திரமாக மாற்றியமைக்கலாம்.

2. Readonly பயன்பாட்டு வகை

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


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

const point: Readonly<Point> = {
  x: 10,
  y: 20,
};

// point.x = 30; // பிழை: 'x' என்பது ஒரு read-only பண்பு என்பதால் அதற்கு ஒதுக்க முடியாது.

Readonly<Point> வகை x மற்றும் y ஆகிய இரண்டையும் readonly ஆகக் கொண்ட ஒரு புதிய வகையை உருவாக்குகிறது. ஏற்கனவே உள்ள ஒரு வகையை விரைவாக மாற்றமுடியாததாக மாற்றுவதற்கு இது ஒரு வசதியான வழியாகும்.

3. Readonly வரிசைகள் (ReadonlyArray<T>) மற்றும் readonly T[]

ஜாவாஸ்கிரிப்ட்டில் வரிசைகள் இயல்பாகவே மாற்றக்கூடியவை. டைப்ஸ்கிரிப்ட் ReadonlyArray<T> வகையையோ அல்லது அதன் சுருக்கமான readonly T[] வடிவத்தையோ பயன்படுத்தி readonly வரிசைகளை உருவாக்க ஒரு வழியை வழங்குகிறது. இது வரிசையின் உள்ளடக்கங்களை மாற்றுவதைத் தடுக்கிறது.


const numbers: ReadonlyArray<number> = [1, 2, 3, 4, 5];
// numbers.push(6); // பிழை: 'push' என்ற பண்பு 'readonly number[]' வகையில் இல்லை.
// numbers[0] = 10; // பிழை: 'readonly number[]' வகையில் உள்ள குறியீட்டு கையொப்பம் வாசிப்பதை மட்டுமே அனுமதிக்கிறது.

const moreNumbers: readonly number[] = [6, 7, 8, 9, 10]; // ReadonlyArray-க்கு சமமானது
// moreNumbers.push(11); // பிழை: 'push' என்ற பண்பு 'readonly number[]' வகையில் இல்லை.

push, pop, splice போன்ற வரிசையை மாற்றும் முறைகளைப் பயன்படுத்த முயற்சிப்பது அல்லது நேரடியாக ஒரு குறியீட்டிற்கு ஒதுக்குவது டைப்ஸ்கிரிப்ட் பிழைக்கு வழிவகுக்கும்.

4. const எதிராக readonly: வேறுபாட்டைப் புரிந்துகொள்ளுதல்

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


const immutableNumber = 42;
// immutableNumber = 43; // பிழை: const மாறி 'immutableNumber'-க்கு மீண்டும் ஒதுக்க முடியாது.

const mutableObject = { value: 10 };
mutableObject.value = 20; // இது அனுமதிக்கப்படுகிறது ஏனெனில் *பொருள்* const அல்ல, மாறி மட்டுமே const.

const readonlyObject: Readonly<{ value: number }> = { value: 30 };
// readonlyObject.value = 40; // பிழை: 'value' என்பது ஒரு read-only பண்பு என்பதால் அதற்கு ஒதுக்க முடியாது.

const constReadonlyObject: Readonly<{ value: number }> = { value: 50 };
// constReadonlyObject = { value: 60 }; // பிழை: const மாறி 'constReadonlyObject'-க்கு மீண்டும் ஒதுக்க முடியாது.
// constReadonlyObject.value = 60; // பிழை: 'value' என்பது ஒரு read-only பண்பு என்பதால் அதற்கு ஒதுக்க முடியாது.

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

நடைமுறை எடுத்துக்காட்டுகள்: நிஜ உலக சூழ்நிலைகளில் Readonly வகைகளைப் பயன்படுத்துதல்

பல்வேறு சூழ்நிலைகளில் குறியீட்டின் தரம் மற்றும் பராமரிப்புத்திறனை மேம்படுத்த readonly வகைகள் எவ்வாறு பயன்படுத்தப்படலாம் என்பதற்கான சில நடைமுறை எடுத்துக்காட்டுகளை ஆராய்வோம்.

1. உள்ளமைவுத் தரவை நிர்வகித்தல்

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


interface AppConfig {
  readonly apiUrl: string;
  readonly timeout: number;
  readonly features: readonly string[];
}

const config: AppConfig = {
  apiUrl: "https://api.example.com",
  timeout: 5000,
  features: ["featureA", "featureB"],
};

function fetchData(url: string, config: Readonly<AppConfig>) {
    // ... config.timeout மற்றும் config.apiUrl-ஐ அவை மாறாது என்பதை அறிந்து பாதுகாப்பாகப் பயன்படுத்தவும்
}

fetchData("/data", config);

2. Redux போன்ற நிலை மேலாண்மையைச் செயல்படுத்துதல்

Redux போன்ற நிலை மேலாண்மை நூலகங்களில், மாற்றமுடியாத தன்மை ஒரு முக்கிய கொள்கையாகும். நிலை மாற்றமுடியாததாக இருப்பதை உறுதிப்படுத்தவும், reducers ஏற்கனவே உள்ளவற்றை மாற்றுவதற்குப் பதிலாக புதிய நிலை பொருட்களை மட்டுமே திருப்பித் தருவதை உறுதிப்படுத்தவும் readonly வகைகளைப் பயன்படுத்தலாம்.


interface State {
  readonly count: number;
  readonly items: readonly string[];
}

const initialState: State = {
  count: 0,
  items: [],
};

function reducer(state: Readonly<State>, action: { type: string; payload?: any }): State {
  switch (action.type) {
    case "INCREMENT":
      return { ...state, count: state.count + 1 }; // ஒரு புதிய நிலை பொருளைத் திருப்பியளிக்கவும்
    case "ADD_ITEM":
      return { ...state, items: [...state.items, action.payload] }; // புதுப்பிக்கப்பட்ட பொருட்களுடன் ஒரு புதிய நிலை பொருளைத் திருப்பியளிக்கவும்
    default:
      return state;
  }
}

3. API பதில்களுடன் வேலை செய்தல்

ஒரு API-யிலிருந்து தரவைப் பெறும்போது, பதில் தரவை மாற்றமுடியாததாகக் கருதுவது பெரும்பாலும் விரும்பத்தக்கது, குறிப்பாக நீங்கள் அதை UI கூறுகளை ரெண்டரிங் செய்யப் பயன்படுத்தும்போது. readonly வகைகள் API தரவின் தற்செயலான மாற்றங்களைத் தடுக்க உதவும்.


interface ApiResponse {
  readonly userId: number;
  readonly id: number;
  readonly title: string;
  readonly completed: boolean;
}

async function fetchTodo(id: number): Promise<Readonly<ApiResponse>> {
  const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${id}`);
  const data: ApiResponse = await response.json();
  return data;
}

fetchTodo(1).then(todo => {
  console.log(todo.title);
  // todo.completed = true; // பிழை: 'completed' என்பது ஒரு read-only பண்பு என்பதால் அதற்கு ஒதுக்க முடியாது.
});

4. புவியியல் தரவை மாதிரியாக்குதல் (சர்வதேச எடுத்துக்காட்டு)

புவியியல் ஆயத்தொலைவுகளைப் பிரதிநிதித்துவப்படுத்துவதைக் கவனியுங்கள். ஒரு ஆயத்தொலைவு அமைக்கப்பட்டவுடன், அது আদর্শமாக மாறாமல் இருக்க வேண்டும். இது தரவு ஒருமைப்பாட்டை உறுதி செய்கிறது, குறிப்பாக வட அமெரிக்கா, ஐரோப்பா மற்றும் ஆசியா முழுவதும் பரவியுள்ள ஒரு டெலிவரி சேவைக்கான GPS ஆயத்தொலைவுகள் போன்ற பல்வேறு புவியியல் பகுதிகளில் செயல்படும் மேப்பிங் அல்லது வழிசெலுத்தல் அமைப்புகள் போன்ற முக்கியமான பயன்பாடுகளைக் கையாளும்போது.


interface GeoCoordinates {
 readonly latitude: number;
 readonly longitude: number;
}

const tokyoCoordinates: GeoCoordinates = {
 latitude: 35.6895,
 longitude: 139.6917
};

const newYorkCoordinates: GeoCoordinates = {
 latitude: 40.7128,
 longitude: -74.0060
};


function calculateDistance(coord1: Readonly<GeoCoordinates>, coord2: Readonly<GeoCoordinates>): number {
 // அட்சரேகை மற்றும் தீர்க்கரேகையைப் பயன்படுத்தி சிக்கலான கணக்கீட்டை கற்பனை செய்து பாருங்கள்
 // எளிமைக்காக ஒரு பதிலி மதிப்பைத் திருப்பியளிக்கிறது
 return 1000; 
}

const distance = calculateDistance(tokyoCoordinates, newYorkCoordinates);
console.log("Distance between Tokyo and New York (placeholder):", distance);

// tokyoCoordinates.latitude = 36.0; // பிழை: 'latitude' என்பது ஒரு read-only பண்பு என்பதால் அதற்கு ஒதுக்க முடியாது.

ஆழமான Readonly வகைகள்: உள்ளமைக்கப்பட்ட பொருட்களைக் கையாளுதல்

Readonly<T> பயன்பாட்டு வகை ஒரு பொருளின் நேரடிப் பண்புகளை மட்டுமே readonly ஆக்குகிறது. ஒரு பொருளில் உள்ளமைக்கப்பட்ட பொருள்கள் அல்லது வரிசைகள் இருந்தால், அந்த உள்ளமைக்கப்பட்ட கட்டமைப்புகள் மாற்றக்கூடியதாகவே இருக்கும். உண்மையான ஆழமான மாற்றமுடியாத தன்மையை அடைய, நீங்கள் அனைத்து உள்ளமைக்கப்பட்ட பண்புகளுக்கும் Readonly<T>-ஐ மீண்டும் மீண்டும் பயன்படுத்த வேண்டும்.

ஆழமான readonly வகையை உருவாக்குவது எப்படி என்பதற்கான ஒரு எடுத்துக்காட்டு இங்கே:


type DeepReadonly<T> = T extends (infer R)[]
  ? DeepReadonlyArray<R>
  : T extends object
  ? DeepReadonlyObject<T>
  : T;

interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {}

type DeepReadonlyObject<T> = {
  readonly [P in keyof T]: DeepReadonly<T[P]>;
};

interface Company {
  name: string;
  address: {
    street: string;
    city: string;
    country: string;
  };
  employees: string[];
}

const company: DeepReadonly<Company> = {
  name: "Example Corp",
  address: {
    street: "123 Main St",
    city: "Anytown",
    country: "USA",
  },
  employees: ["Alice", "Bob"],
};

// company.name = "New Corp"; // பிழை
// company.address.city = "New City"; // பிழை
// company.employees.push("Charlie"); // பிழை

இந்த DeepReadonly<T> வகை அனைத்து உள்ளமைக்கப்பட்ட பண்புகளுக்கும் Readonly<T>-ஐ மீண்டும் மீண்டும் பயன்படுத்துகிறது, இதனால் முழு பொருள் கட்டமைப்பும் மாற்றமுடியாததாக இருப்பதை உறுதி செய்கிறது.

கருத்தில் கொள்ள வேண்டியவை மற்றும் சமரசங்கள்

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

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

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

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

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

முடிவுரை: டைப்ஸ்கிரிப்ட் Readonly வகைகளுடன் மாற்றமுடியாத தன்மையைத் தழுவுதல்

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