Type — dasturlash tilida qiymatning qaysi toifaga mansubligini, xotirada qanday ifodalanishini va unga qaysi amallarni qo‘llash mumkinligini belgilovchi tushunchadir. Integer, string, boolean, array va function keng tarqalgan turlardir. Type tizimi noto‘g‘ri amallarni kompilyatsiya vaqtida yoki dastur bajarilayotgan paytda aniqlashi mumkin.
Static va dynamic typing
Static typed tilda expression va o‘zgaruvchi turlari dastur bajarilishidan oldin tekshiriladi. Compiler number kutilgan joyga matn uzatilganini rad etishi mumkin. Type annotation har doim majburiy emas; type inference qiymat va amaldan turni topadi.
Dynamic typed tilda type o‘zgaruvchi slotiga emas, runtime qiymatiga bog‘liq bo‘lishi mumkin. Bir o‘zgaruvchi turli paytda son va matnni ushlashi mumkin. Type xatosi faqat shu kod yo‘li bajarilganda ko‘rinishi ehtimoli bor.
Static va dynamic “xavfsiz” hamda “xavfsiz emas”ning to‘liq sinonimi emas. Har ikki modelda test, validation va to‘g‘ri API shartnomasi kerak.
Primitive va composite type
Primitive type odatda tilning asosiy qiymatlarini ifodalaydi: integer, floating-point, character, boolean. Composite type boshqa turlardan tuziladi: array bir xil elementlar ketma-ketligi, tuple belgilangan pozitsiyalar, record yoki struct nomlangan maydonlar, map esa kalit-qiymat bog‘lanishidir.
Reference type qiymatning o‘zi o‘rniga obyektga havola semantikasiga ega bo‘lishi mumkin. Nusxa olishda ikki o‘zgaruvchi bir obyektni ko‘rsatib qolsa, bir tomondagi mutation ikkinchisida ko‘rinadi. Value type nusxasi esa mustaqil qiymat bo‘lishi mumkin; aniq xulq tilga bog‘liq.
Nominal va structural typing
Nominal tizimda ikki type mosligi ularning e’lon qilingan nomi yoki inheritance aloqasiga tayanadi. Structural typingda kerakli maydon va methodlar mavjud bo‘lsa, nomi boshqa bo‘lgan obyekt mos kelishi mumkin. TypeScript structural yondashuvdan keng foydalanadi.
Duck typing “kerakli amalni bajara olsa, mos” tamoyiliga yaqin runtime yondashuvdir. Structural static type esa shu shaklni oldindan tekshiradi.
Generic type
Generic bitta algoritmni turli turlar uchun type ma’lumotini saqlagan holda yozadi. List<T> element turi T ekanini bildiradi. Generic constraint T ma’lum interface yoki xususiyatga ega bo‘lishini talab qilishi mumkin.
Variance generic containerlar orasidagi subtype bog‘lanishini boshqaradi. Faqat qiymat chiqaradigan producer covariant, qiymat qabul qiladigan consumer contravariant bo‘lishi mumkin. Noto‘g‘ri variance writable kolleksiyaga mos bo‘lmagan qiymat kiritish imkonini berardi.
Nullability va union
Nullable type qiymat bilan birga yo‘qlik holatini ham ifodalaydi. Nullability type tizimida aniq ko‘rsatilsa, qiymat ishlatilishidan oldin tekshiruv talab qilinadi. Union type qiymat bir nechta turdan biri bo‘lishini bildiradi. Discriminated union umumiy tag maydoni orqali variantni xavfsiz ajratadi.
Type runtime ma’lumot validatsiyasining o‘rnini bosmaydi. JSON, forma yoki database’dan kelgan qiymat dastur typeiga aylantirilishidan oldin tekshiriladi, chunki tashqi ma’lumot compiler nazoratidan tashqarida.
Type narrowing
Union qiymat ishlatilishidan oldin runtime tekshiruv orqali aniq variantga toraytiriladi. typeof, instanceof, property mavjudligi yoki discriminant maydon control flow analysisga signal beradi. Exhaustive switch yangi variant qo‘shilganda ko‘rilmagan branchni compiler xatosiga aylantirishi mumkin. Type assertion tekshiruvsiz “bu qiymat shu tur” deb compilerga aytadi; u runtime qiymatni o‘zgartirmaydi. Noto‘g‘ri assertion type tizimi kafolatini chetlab o‘tadi. User-defined type guard tekshiruv mantiqini qayta foydalaniladigan functionga ajratadi, ammo uning e’lon qilgan natijasi real tekshiruvga mos bo‘lishi kerak.
Bog‘liq tushunchalar
type system, static typing, dynamic typing, type inference, generics, union type, nullability