ಕನ್ನಡ

ಟೈಪ್‌ಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿ readonly ಟೈಪ್‌ಗಳೊಂದಿಗೆ ಬದಲಾಗದ ಡೇಟಾ ರಚನೆಗಳ ಶಕ್ತಿಯನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ. ಅನಪೇಕ್ಷಿತ ಡೇಟಾ ಬದಲಾವಣೆಗಳನ್ನು ತಡೆಯುವ ಮೂಲಕ ಹೆಚ್ಚು ಊಹಿಸಬಹುದಾದ, ನಿರ್ವಹಿಸಬಲ್ಲ, ಮತ್ತು ದೃಢವಾದ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ರಚಿಸಲು ಕಲಿಯಿರಿ.

ಟೈಪ್‌ಸ್ಕ್ರಿಪ್ಟ್ Readonly ಟೈಪ್‌ಗಳು: ಬದಲಾಗದ ಡೇಟಾ ರಚನೆಗಳಲ್ಲಿ ಪ್ರಾವೀಣ್ಯತೆ

ಸದಾ ವಿಕಸಿಸುತ್ತಿರುವ ಸಾಫ್ಟ್‌ವೇರ್ ಅಭಿವೃದ್ಧಿಯ ಜಗತ್ತಿನಲ್ಲಿ, ದೃಢವಾದ, ಊಹಿಸಬಹುದಾದ ಮತ್ತು ನಿರ್ವಹಿಸಬಲ್ಲ ಕೋಡ್ ರಚಿಸುವುದು ಒಂದು ನಿರಂತರ ಪ್ರಯತ್ನವಾಗಿದೆ. ಟೈಪ್‌ಸ್ಕ್ರಿಪ್ಟ್, ತನ್ನ ಬಲವಾದ ಟೈಪಿಂಗ್ ವ್ಯವಸ್ಥೆಯೊಂದಿಗೆ, ಈ ಗುರಿಗಳನ್ನು ಸಾಧಿಸಲು ಶಕ್ತಿಯುತ ಸಾಧನಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ. ಈ ಸಾಧನಗಳಲ್ಲಿ, readonly ಟೈಪ್‌ಗಳು ಬದಲಾಗದಿರುವಿಕೆಯನ್ನು (immutability) ಜಾರಿಗೊಳಿಸಲು ಒಂದು ಪ್ರಮುಖ ಯಾಂತ್ರಿಕತೆಯಾಗಿ ನಿಲ್ಲುತ್ತವೆ, ಇದು ಫಂಕ್ಷನಲ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್‌ನ ಮೂಲಾಧಾರ ಮತ್ತು ಹೆಚ್ಚು ವಿಶ್ವಾಸಾರ್ಹ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಪ್ರಮುಖವಾಗಿದೆ.

ಬದಲಾಗದಿರುವಿಕೆ (Immutability) ಎಂದರೇನು ಮತ್ತು ಅದು ಏಕೆ ಮುಖ್ಯ?

ಮೂಲಭೂತವಾಗಿ, ಬದಲಾಗದಿರುವಿಕೆ ಎಂದರೆ, ಒಂದು ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ರಚಿಸಿದ ನಂತರ, ಅದರ ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸಲಾಗುವುದಿಲ್ಲ. ಈ ಸರಳ ಪರಿಕಲ್ಪನೆಯು ಕೋಡ್ ಗುಣಮಟ್ಟ ಮತ್ತು ನಿರ್ವಹಣೆಯ ಮೇಲೆ ಆಳವಾದ ಪರಿಣಾಮಗಳನ್ನು ಬೀರುತ್ತದೆ.

ಟೈಪ್‌ಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿ Readonly ಟೈಪ್‌ಗಳು: ನಿಮ್ಮ ಬದಲಾಗದಿರುವಿಕೆಯ ಅಸ್ತ್ರಾಗಾರ

ಟೈಪ್‌ಸ್ಕ್ರಿಪ್ಟ್ readonly ಕೀವರ್ಡ್ ಬಳಸಿ ಬದಲಾಗದಿರುವಿಕೆಯನ್ನು ಜಾರಿಗೊಳಿಸಲು ಹಲವಾರು ಮಾರ್ಗಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ. ವಿವಿಧ ತಂತ್ರಗಳನ್ನು ಮತ್ತು ಅವುಗಳನ್ನು ಆಚರಣೆಯಲ್ಲಿ ಹೇಗೆ ಅನ್ವಯಿಸಬಹುದು ಎಂಬುದನ್ನು ಅನ್ವೇಷಿಸೋಣ.

1. ಇಂಟರ್‌ಫೇಸ್‌ಗಳು ಮತ್ತು ಟೈಪ್‌ಗಳಲ್ಲಿ Readonly ಪ್ರಾಪರ್ಟಿಗಳು

ಒಂದು ಪ್ರಾಪರ್ಟಿಯನ್ನು readonly ಎಂದು ಘೋಷಿಸಲು ಅತ್ಯಂತ ನೇರವಾದ ಮಾರ್ಗವೆಂದರೆ ಇಂಟರ್ಫೇಸ್ ಅಥವಾ ಟೈಪ್ ಡೆಫಿನಿಷನ್‌ನಲ್ಲಿ ನೇರವಾಗಿ 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[]

ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿ ಅರೇಗಳು ಅಂತರ್ಗತವಾಗಿ ಬದಲಾಯಿಸಬಹುದಾದವು (mutable). ಟೈಪ್‌ಸ್ಕ್ರಿಪ್ಟ್ ReadonlyArray<T> ಟೈಪ್ ಅಥವಾ readonly T[] ಶಾರ್ಟ್‌ಹ್ಯಾಂಡ್ ಬಳಸಿ readonly ಅರೇಗಳನ್ನು ರಚಿಸಲು ಒಂದು ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತದೆ. ಇದು ಅರೇಯ ವಿಷಯಗಳ ಮಾರ್ಪಾಡನ್ನು ತಡೆಯುತ್ತದೆ.


const numbers: ReadonlyArray<number> = [1, 2, 3, 4, 5];
// numbers.push(6); // ದೋಷ: 'readonly number[]' ಟೈಪ್‌ನಲ್ಲಿ 'push' ಪ್ರಾಪರ್ಟಿ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.
// numbers[0] = 10; // ದೋಷ: 'readonly number[]' ಟೈಪ್‌ನಲ್ಲಿರುವ ಇಂಡೆಕ್ಸ್ ಸಿಗ್ನೇಚರ್ ಕೇವಲ ಓದಲು ಅನುಮತಿಸುತ್ತದೆ.

const moreNumbers: readonly number[] = [6, 7, 8, 9, 10]; // ReadonlyArray ಗೆ ಸಮಾನ
// moreNumbers.push(11); // ದೋಷ: 'readonly number[]' ಟೈಪ್‌ನಲ್ಲಿ 'push' ಪ್ರಾಪರ್ಟಿ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.

ಅರೇಯನ್ನು ಮಾರ್ಪಡಿಸುವ 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 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. ರೆಡಕ್ಸ್-ರೀತಿಯ ಸ್ಟೇಟ್ ಮ್ಯಾನೇಜ್‌ಮೆಂಟ್ ಅನುಷ್ಠಾನ

ರೆಡಕ್ಸ್‌ನಂತಹ ಸ್ಟೇಟ್ ಮ್ಯಾನೇಜ್‌ಮೆಂಟ್ ಲೈಬ್ರರಿಗಳಲ್ಲಿ, ಬದಲಾಗದಿರುವಿಕೆ ಒಂದು ಪ್ರಮುಖ ತತ್ವವಾಗಿದೆ. ಸ್ಟೇಟ್ ಬದಲಾಗದಂತೆ ಮತ್ತು ರೆಡ್ಯೂಸರ್‌ಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಸ್ಟೇಟ್ ಆಬ್ಜೆಕ್ಟ್‌ಗಳನ್ನು ಮಾರ್ಪಡಿಸದೆ ಹೊಸ ಸ್ಟೇಟ್ ಆಬ್ಜೆಕ್ಟ್‌ಗಳನ್ನು ಮಾತ್ರ ಹಿಂತಿರುಗಿಸುತ್ತವೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು 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 ಮಾಡುತ್ತದೆ. ಒಂದು ಆಬ್ಜೆಕ್ಟ್ ನೆಸ್ಟೆಡ್ ಆಬ್ಜೆಕ್ಟ್‌ಗಳು ಅಥವಾ ಅರೇಗಳನ್ನು ಹೊಂದಿದ್ದರೆ, ಆ ನೆಸ್ಟೆಡ್ ರಚನೆಗಳು ಬದಲಾಯಿಸಬಹುದಾದಂತೆಯೇ (mutable) ಉಳಿಯುತ್ತವೆ. ನಿಜವಾದ ಆಳವಾದ ಬದಲಾಗದಿರುವಿಕೆಯನ್ನು ಸಾಧಿಸಲು, ನೀವು ಎಲ್ಲಾ ನೆಸ್ಟೆಡ್ ಪ್ರಾಪರ್ಟಿಗಳಿಗೆ 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 ಟೈಪ್‌ಗಳನ್ನು ನಿಮ್ಮ ಅಭಿವೃದ್ಧಿ ಕಾರ್ಯಪ್ರವಾಹದ ಕೇಂದ್ರ ಭಾಗವನ್ನಾಗಿ ಮಾಡಿ.