O'zbek

Qat'iy qiymat cheklovlarini qo'llash, kodning tushunarliligini oshirish va xatolarning oldini olish uchun kuchli xususiyat bo'lgan TypeScript literal turlarini o'rganing. Amaliy misollar va ilg'or texnikalar bilan tanishing.

TypeScript Literal Turlari: Aniq Qiymat Cheklovlarini O'zlashtirish

JavaScript'ning kengaytmasi bo'lgan TypeScript veb-dasturlashning dinamik olamiga statik tiplashtirishni olib keladi. Uning eng kuchli xususiyatlaridan biri bu literal turlar tushunchasidir. Literal turlar o'zgaruvchi yoki xususiyat qabul qilishi mumkin bo'lgan aniq qiymatni belgilashga imkon beradi, bu esa tur xavfsizligini oshiradi va kutilmagan xatolarning oldini oladi. Ushbu maqolada literal turlar chuqur o'rganilib, ularning sintaksisi, qo'llanilishi va afzalliklari amaliy misollar bilan yoritiladi.

Literal Turlar Nima?

string, number yoki boolean kabi an'anaviy turlardan farqli o'laroq, literal turlar keng qiymatlar toifasini ifodalamaydi. Aksincha, ular aniq, belgilangan qiymatlarni ifodalaydi. TypeScript uch turdagi literal turlarni qo'llab-quvvatlaydi:

Literal turlardan foydalanib, siz ma'lumotlaringizning haqiqiy cheklovlarini aks ettiruvchi aniqroq tur ta'riflarini yaratishingiz mumkin, bu esa yanada mustahkam va qo'llab-quvvatlanishi oson kodga olib keladi.

Satrli Literal Turlar

Satrli literal turlar eng ko'p ishlatiladigan literal turidir. Ular o'zgaruvchi yoki xususiyat faqat oldindan belgilangan satr qiymatlari to'plamidan birini qabul qilishi mumkinligini ko'rsatishga imkon beradi.

Asosiy Sintaksis

Satrli literal turini aniqlash sintaksisi juda oddiy:


type AllowedValues = "value1" | "value2" | "value3";

Bu AllowedValues nomli turni e'lon qiladi, u faqat "value1", "value2" yoki "value3" satrlarini qabul qila oladi.

Amaliy Misollar

1. Ranglar Palitrasini Aniqlash:

Tasavvur qiling, siz UI kutubxonasini yaratayapsiz va foydalanuvchilar faqat oldindan belgilangan palitradagi ranglarni ko'rsatishini ta'minlashni xohlaysiz:


type Color = "red" | "green" | "blue" | "yellow";

function paintElement(element: HTMLElement, color: Color) {
  element.style.backgroundColor = color;
}

paintElement(document.getElementById("myElement")!, "red"); // To'g'ri
paintElement(document.getElementById("myElement")!, "purple"); // Xato: '"purple"' turidagi argument 'Color' turidagi parametrga tayinlanmaydi.

Bu misol satrli literal turlari qanday qilib ruxsat etilgan qiymatlar to'plamini qat'iy belgilashi mumkinligini ko'rsatadi, bu esa dasturchilarning tasodifan noto'g'ri ranglardan foydalanishining oldini oladi.

2. API Endopoint'larini Aniqlash:

API'lar bilan ishlaganda, ko'pincha ruxsat etilgan endpoint'larni ko'rsatish kerak bo'ladi. Satrli literal turlar buni ta'minlashga yordam beradi:


type APIEndpoint = "/users" | "/posts" | "/comments";

function fetchData(endpoint: APIEndpoint) {
  // ... belgilangan endpoint'dan ma'lumotlarni olish uchun implementatsiya
  console.log(`${endpoint} manzilidan ma'lumotlar olinmoqda`);
}

fetchData("/users"); // To'g'ri
fetchData("/products"); // Xato: '"/products"' turidagi argument 'APIEndpoint' turidagi parametrga tayinlanmaydi.

Bu misol fetchData funksiyasini faqat haqiqiy API endpoint'lari bilan chaqirish mumkinligini ta'minlaydi, bu esa imlo xatolari yoki noto'g'ri endpoint nomlari tufayli yuzaga keladigan xatolar xavfini kamaytiradi.

3. Turli Tillar Bilan Ishlash (Xalqarolashtirish - i18n):

Global ilovalarda turli tillar bilan ishlashga to'g'ri kelishi mumkin. Ilovangiz faqat belgilangan tillarni qo'llab-quvvatlashini ta'minlash uchun satrli literal turlardan foydalanishingiz mumkin:


type Language = "en" | "es" | "fr" | "de" | "zh";

function translate(text: string, language: Language): string {
  // ... matnni belgilangan tilga tarjima qilish uchun implementatsiya
  console.log(`'${text}' matni ${language} tiliga tarjima qilinmoqda`);
  return "Tarjima qilingan matn"; // Vaqtinchalik qiymat
}

translate("Hello", "en"); // To'g'ri
translate("Hello", "ja"); // Xato: '"ja"' turidagi argument 'Language' turidagi parametrga tayinlanmaydi.

Ushbu misol ilovangizda faqat qo'llab-quvvatlanadigan tillardan foydalanilishini qanday ta'minlashni ko'rsatadi.

Sonli Literal Turlar

Sonli literal turlar o'zgaruvchi yoki xususiyat faqat ma'lum bir sonli qiymatni qabul qilishi mumkinligini ko'rsatishga imkon beradi.

Asosiy Sintaksis

Sonli literal turini aniqlash sintaksisi satrli literal turlariga o'xshaydi:


type StatusCode = 200 | 404 | 500;

Bu StatusCode nomli turni aniqlaydi, u faqat 200, 404 yoki 500 sonlarini qabul qilishi mumkin.

Amaliy Misollar

1. HTTP Status Kodlarini Aniqlash:

Ilovangizda faqat haqiqiy kodlardan foydalanilishini ta'minlash uchun HTTP status kodlarini ifodalash uchun sonli literal turlardan foydalanishingiz mumkin:


type HTTPStatus = 200 | 400 | 401 | 403 | 404 | 500;

function handleResponse(status: HTTPStatus) {
  switch (status) {
    case 200:
      console.log("Muvaffaqiyatli!");
      break;
    case 400:
      console.log("Noto'g'ri so'rov");
      break;
    // ... boshqa holatlar
    default:
      console.log("Noma'lum status");
  }
}

handleResponse(200); // To'g'ri
handleResponse(600); // Xato: '600' turidagi argument 'HTTPStatus' turidagi parametrga tayinlanmaydi.

Bu misol haqiqiy HTTP status kodlaridan foydalanishni majburiy qiladi, bu esa noto'g'ri yoki nostandart kodlardan foydalanish natijasida yuzaga keladigan xatolarning oldini oladi.

2. Belgilangan Opsiyalarni Ifodalash:

Konfiguratsiya obyektida belgilangan variantlarni ifodalash uchun sonli literal turlardan foydalanishingiz mumkin:


type RetryAttempts = 1 | 3 | 5;

interface Config {
  retryAttempts: RetryAttempts;
}

const config1: Config = { retryAttempts: 3 }; // To'g'ri
const config2: Config = { retryAttempts: 7 }; // Xato: '{ retryAttempts: 7; }' turi 'Config' turiga tayinlanmaydi.

Ushbu misol retryAttempts uchun mumkin bo'lgan qiymatlarni ma'lum bir to'plam bilan cheklaydi, bu esa konfiguratsiyangizning tushunarliligi va ishonchliligini oshiradi.

Mantiqiy Literal Turlar

Mantiqiy literal turlar true yoki false aniq qiymatlarini ifodalaydi. Ular satrli yoki sonli literal turlarga qaraganda kamroq moslashuvchan bo'lib ko'rinsa-da, ma'lum bir stsenariylarda foydali bo'lishi mumkin.

Asosiy Sintaksis

Mantiqiy literal turini aniqlash sintaksisi:


type IsEnabled = true | false;

Biroq, to'g'ridan-to'g'ri true | false dan foydalanish ortiqcha, chunki bu boolean turiga teng. Mantiqiy literal turlar boshqa turlar bilan yoki shartli turlarda birlashtirilganda ko'proq foydalidir.

Amaliy Misollar

1. Konfiguratsiya Bilan Shartli Mantiq:

Konfiguratsiya bayrog'iga asoslangan funksiya xatti-harakatini boshqarish uchun mantiqiy literal turlardan foydalanishingiz mumkin:


interface FeatureFlags {
  darkMode: boolean;
  newUserFlow: boolean;
}

function initializeApp(flags: FeatureFlags) {
  if (flags.darkMode) {
    // Qorong'u rejimni yoqish
    console.log("Qorong'u rejim yoqilmoqda...");
  } else {
    // Yorug' rejimdan foydalanish
    console.log("Yorug' rejimidan foydalanilmoqda...");
  }

  if (flags.newUserFlow) {
    // Yangi foydalanuvchi oqimini yoqish
    console.log("Yangi foydalanuvchi oqimi yoqilmoqda...");
  } else {
    // Eski foydalanuvchi oqimidan foydalanish
    console.log("Eski foydalanuvchi oqimidan foydalanilmoqda...");
  }
}

initializeApp({ darkMode: true, newUserFlow: false });

Ushbu misolda standart boolean turi ishlatilgan bo'lsa-da, siz uni shartli turlar bilan (keyinroq tushuntiriladi) birlashtirib, murakkabroq xatti-harakatlarni yaratishingiz mumkin.

2. Ajratilgan Birlashmalar:

Mantiqiy literal turlar birlashma turlarida diskriminator sifatida ishlatilishi mumkin. Quyidagi misolni ko'rib chiqing:


interface SuccessResult {
  success: true;
  data: any;
}

interface ErrorResult {
  success: false;
  error: string;
}

type Result = SuccessResult | ErrorResult;

function processResult(result: Result) {
  if (result.success) {
    console.log("Muvaffaqiyatli:", result.data);
  } else {
    console.error("Xato:", result.error);
  }
}

processResult({ success: true, data: { name: "John" } });
processResult({ success: false, error: "Ma'lumotlarni olishda xatolik" });

Bu yerda, mantiqiy literal tur bo'lgan success xususiyati diskriminator vazifasini bajaradi, bu TypeScript'ga if iborasi ichida result turini toraytirishga imkon beradi.

Literal Turlarni Birlashma Turlari Bilan Birlashtirish

Literal turlar birlashma turlari (| operatori yordamida) bilan birlashtirilganda eng kuchli bo'ladi. Bu sizga bir nechta aniq qiymatlardan birini qabul qila oladigan turni aniqlash imkonini beradi.

Amaliy Misollar

1. Status Turini Aniqlash:


type Status = "pending" | "in progress" | "completed" | "failed";

interface Task {
  id: number;
  description: string;
  status: Status;
}

const task1: Task = { id: 1, description: "Implement login", status: "in progress" }; // To'g'ri
const task2: Task = { id: 2, description: "Implement logout", status: "done" };       // Xato: '{ id: number; description: string; status: string; }' turi 'Task' turiga tayinlanmaydi.

Bu misol Task obyekti uchun ruxsat etilgan status qiymatlarining ma'lum bir to'plamini qanday qilib majburiy qilishni ko'rsatadi.

2. Qurilma Turini Aniqlash:

Mobil ilovada siz turli xil qurilma turlari bilan ishlashingiz kerak bo'lishi mumkin. Ularni ifodalash uchun satrli literal turlarining birlashmasidan foydalanishingiz mumkin:


type DeviceType = "mobile" | "tablet" | "desktop";

function logDeviceType(device: DeviceType) {
  console.log(`Qurilma turi: ${device}`);
}

logDeviceType("mobile"); // To'g'ri
logDeviceType("smartwatch"); // Xato: '"smartwatch"' turidagi argument 'DeviceType' turidagi parametrga tayinlanmaydi.

Bu misol logDeviceType funksiyasining faqat haqiqiy qurilma turlari bilan chaqirilishini ta'minlaydi.

Literal Turlar va Tur Taxalluslari

Tur taxalluslari (type kalit so'zi yordamida) literal turga nom berish usulini ta'minlaydi, bu esa kodingizni o'qilishi oson va qo'llab-quvvatlanadigan qiladi.

Amaliy Misollar

1. Valyuta Kodi Turini Aniqlash:


type CurrencyCode = "USD" | "EUR" | "GBP" | "JPY";

function formatCurrency(amount: number, currency: CurrencyCode): string {
  // ... summani valyuta kodiga qarab formatlash uchun implementatsiya
  console.log(`${amount} miqdori ${currency}da formatlanmoqda`);
  return "Formatlangan summa"; // Vaqtinchalik qiymat
}

formatCurrency(100, "USD"); // To'g'ri
formatCurrency(200, "CAD"); // Xato: '"CAD"' turidagi argument 'CurrencyCode' turidagi parametrga tayinlanmaydi.

Bu misol CurrencyCode tur taxallusini valyuta kodlari to'plami uchun aniqlaydi, bu esa formatCurrency funksiyasining o'qilishini yaxshilaydi.

2. Hafta Kuni Turini Aniqlash:


type DayOfWeek = "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday" | "Sunday";

function isWeekend(day: DayOfWeek): boolean {
  return day === "Saturday" || day === "Sunday";
}

console.log(isWeekend("Monday"));   // false
console.log(isWeekend("Saturday")); // true
console.log(isWeekend("Funday"));   // Xato: '"Funday"' turidagi argument 'DayOfWeek' turidagi parametrga tayinlanmaydi.

Literalni Avtomatik Chiqarish

TypeScript ko'pincha siz o'zgaruvchilarga tayinlagan qiymatlarga asoslanib, literal turlarni avtomatik ravishda aniqlashi mumkin. Bu, ayniqsa, const o'zgaruvchilari bilan ishlaganda foydalidir.

Amaliy Misollar

1. Satrli Literal Turlarni Avtomatik Chiqarish:


const apiKey = "your-api-key"; // TypeScript apiKey turini "your-api-key" deb avtomatik aniqlaydi

function validateApiKey(key: "your-api-key") {
  return key === "your-api-key";
}

console.log(validateApiKey(apiKey)); // true

const anotherKey = "invalid-key";
console.log(validateApiKey(anotherKey)); // Xato: 'string' turidagi argument '"your-api-key"' turidagi parametrga tayinlanmaydi.

Ushbu misolda TypeScript apiKey turini "your-api-key" satrli literal turi sifatida avtomatik aniqlaydi. Biroq, agar siz o'zgaruvchiga o'zgarmas bo'lmagan qiymat tayinlasangiz, TypeScript odatda kengroq string turini aniqlaydi.

2. Sonli Literal Turlarni Avtomatik Chiqarish:


const port = 8080; // TypeScript port turini 8080 deb avtomatik aniqlaydi

function startServer(portNumber: 8080) {
  console.log(`${portNumber} portida server ishga tushirilmoqda`);
}

startServer(port); // To'g'ri

const anotherPort = 3000;
startServer(anotherPort); // Xato: 'number' turidagi argument '8080' turidagi parametrga tayinlanmaydi.

Literal Turlarni Shartli Turlar Bilan Ishlatish

Literal turlar shartli turlar bilan birlashtirilganda yanada kuchliroq bo'ladi. Shartli turlar sizga boshqa turlarga bog'liq bo'lgan turlarni aniqlash imkonini beradi, bu esa juda moslashuvchan va ifodali tur tizimlarini yaratadi.

Asosiy Sintaksis

Shartli turning sintaksisi:


TypeA extends TypeB ? TypeC : TypeD

Bu shuni anglatadi: agar TypeA turi TypeB turiga tayinlanishi mumkin bo'lsa, natijaviy tur TypeC bo'ladi; aks holda, natijaviy tur TypeD bo'ladi.

Amaliy Misollar

1. Statusni Xabarga Moslashtirish:


type Status = "pending" | "in progress" | "completed" | "failed";

type StatusMessage = T extends "pending"
  ? "Harakat kutilmoqda"
  : T extends "in progress"
  ? "Hozirda qayta ishlanmoqda"
  : T extends "completed"
  ? "Vazifa muvaffaqiyatli yakunlandi"
  : "Xatolik yuz berdi";

function getStatusMessage(status: T): StatusMessage {
  switch (status) {
    case "pending":
      return "Harakat kutilmoqda" as StatusMessage;
    case "in progress":
      return "Hozirda qayta ishlanmoqda" as StatusMessage;
    case "completed":
      return "Vazifa muvaffaqiyatli yakunlandi" as StatusMessage;
    case "failed":
      return "Xatolik yuz berdi" as StatusMessage;
    default:
      throw new Error("Noto'g'ri status");
  }
}

console.log(getStatusMessage("pending"));    // Harakat kutilmoqda
console.log(getStatusMessage("in progress")); // Hozirda qayta ishlanmoqda
console.log(getStatusMessage("completed"));   // Vazifa muvaffaqiyatli yakunlandi
console.log(getStatusMessage("failed"));      // Xatolik yuz berdi

Ushbu misol shartli turlar yordamida har bir mumkin bo'lgan statusni mos keladigan xabarga bog'laydigan StatusMessage turini aniqlaydi. getStatusMessage funksiyasi tur xavfsizligiga ega status xabarlarini taqdim etish uchun ushbu turdan foydalanadi.

2. Tur Xavfsizligiga Ega Hodisa Ishlovchisini Yaratish:


type EventType = "click" | "mouseover" | "keydown";

type EventData = T extends "click"
  ? { x: number; y: number; } // "click" hodisasi ma'lumotlari
  : T extends "mouseover"
  ? { target: HTMLElement; }   // "mouseover" hodisasi ma'lumotlari
  : { key: string; }             // "keydown" hodisasi ma'lumotlari

function handleEvent(type: T, data: EventData) {
  console.log(`${type} turidagi hodisa quyidagi ma'lumotlar bilan ishlanmoqda:`, data);
}

handleEvent("click", { x: 10, y: 20 }); // To'g'ri
handleEvent("mouseover", { target: document.getElementById("myElement")! }); // To'g'ri
handleEvent("keydown", { key: "Enter" }); // To'g'ri

handleEvent("click", { key: "Enter" }); // Xato: '{ key: string; }' turidagi argument '{ x: number; y: number; }' turidagi parametrga tayinlanmaydi.

Ushbu misol hodisa turiga qarab turli xil ma'lumotlar tuzilmalarini aniqlaydigan EventData turini yaratadi. Bu har bir hodisa turi uchun handleEvent funksiyasiga to'g'ri ma'lumotlar uzatilishini ta'minlashga imkon beradi.

Literal Turlardan Foydalanish Bo'yicha Eng Yaxshi Amaliyotlar

TypeScript loyihalaringizda literal turlardan samarali foydalanish uchun quyidagi eng yaxshi amaliyotlarni ko'rib chiqing:

Literal Turlardan Foydalanishning Afzalliklari

Xulosa

TypeScript literal turlari qat'iy qiymat cheklovlarini qo'llash, kodning tushunarliligini oshirish va xatolarning oldini olish imkonini beruvchi kuchli xususiyatdir. Ularning sintaksisi, qo'llanilishi va afzalliklarini tushunib, siz yanada mustahkam va qo'llab-quvvatlanadigan TypeScript ilovalarini yaratish uchun literal turlardan foydalanishingiz mumkin. Ranglar palitralari va API endpoint'larini aniqlashdan tortib, turli tillar bilan ishlash va tur xavfsizligiga ega hodisa ishlovchilarini yaratishgacha, literal turlar sizning dasturlash ish jarayoningizni sezilarli darajada yaxshilaydigan keng ko'lamli amaliy qo'llanmalarni taklif etadi.