Type checking — dasturdagi qiymat, ifoda, o‘zgaruvchi va amallar turlarining til qoidalariga mosligini tekshirish jarayonidir. Statik type checking kompilyatsiya yoki alohida analiz bosqichida, dynamic checking esa amal bajarilayotgan paytda ishlaydi. Maqsad noto‘g‘ri turdagi qiymat bilan bajarilmaydigan yoki ma’nosiz operatsiyani erta aniqlashdir.
Statik tekshiruv
Compiler literal, deklaratsiya va funksiya signature’laridan type ma’lumotini oladi. integer talab qiladigan operatorga satr berilsa diagnostika chiqaradi. Type inference aniq annotation yozilmagan joyda ifoda va constraintlardan tur chiqaradi. Inference kodni ixcham qiladi, lekin ommaviy API’da annotation hujjat va barqaror shartnoma vazifasini bajaradi.
Assignment compatibility subtype, variance va conversion qoidalariga bog‘liq. Avtomatik numeric widening xavfsiz bo‘lishi mumkin, narrowing esa qiymat yo‘qotadi va explicit cast talab qiladi. Cast compilerga dasturchi niyatini bildiradi, lekin runtime obyekt haqiqatan mos bo‘lmasa xato qoladi. Unsafe cast type system kafolatini chetlab o‘tadi.
Generik va polymorphism
Generics bir algoritmni bir nechta type bilan, compile-time tekshiruvni saqlagan holda ishlatadi. Type parameter constraint “taqqoslanadi”, “ma’lum interface’ni bajaradi” yoki “constructor mavjud” kabi talabni ifodalaydi. Monomorphization har konkret tur uchun kod yaratishi, type erasure esa umumiy runtime ko‘rinishidan foydalanishi mumkin.
Subtype polymorphismda bazaviy interface reference’i turli implementatsiyani ko‘rsatadi. Method override signature va return type qoidalarga mos bo‘ladi. Collection variance muhim: List<Cat> har doim List<Animal> sifatida yoziladigan bo‘lsa, unga Dog qo‘shilib type safety buzilishi mumkin. Shu sababli mutable generiklar ko‘pincha invariant.
Null va flow-sensitive tahlil
Nullable type qiymat yo‘qligini alohida ifodalaydi. Null checkdan keyin analyzer shu control-flow yo‘lida type’ni non-null deb toraytirishi mumkin. Pattern matching ham runtime tekshiruvdan keyin aniq subtype va uning maydonlarini scope’ga kiritadi. Bir thread tekshirgan mutable qiymatni boshqasi o‘zgartirsa, flow xulosasi xavfsiz bo‘lishi uchun til concurrency modeliga tayanadi.
Gradual typing dinamik kodga ixtiyoriy annotation qo‘shadi. Any yoki dynamic type tekshiruvni chegarada o‘chiradi; u haddan ko‘p tarqalsa static foyda kamayadi. Tashqi JSON, database va FFI qiymati trust boundary’da parse va validate qilinib, ichki aniq turga aylantiriladi.
Diagnostika va cheklov
Yaxshi xato xabari kutilgan va olingan type, constraint kelib chiqishi va source joyini ko‘rsatadi. Murakkab generik xatoda asosiy nomoslik ikkilamchi xabarlardan ajratiladi. Type checking biznes qoidasi, qiymat diapazoni va authorizationni avtomatik isbotlamaydi. string turi elektron pochta formati yoki xavfsiz HTML degani emas; domain-specific wrapper va runtime validatsiya talab qilinishi mumkin.
+## Effekt va birlik turlari
Oddiy primitive type ba’zan semantik farqni ifodalamaydi: metr va soniya ikkalasi ham float, foydalanuvchi ID va buyurtma ID ikkalasi ham string bo‘lishi mumkin. Newtype yoki wrapper noto‘g‘ri qiymatlarni aralashtirishni compile time’da to‘sadi. Unit-of-measure tizimi fizik birlik amallarini tekshiradi. Effekt tizimi funksiya I/O, exception yoki async amal bajarishini type’da ko‘rsatishi mumkin. Bu kuchli model API’ni ravshan qiladi, lekin type murakkabligi va o‘rganish xarajatini oshiradi. Chegaradagi parsing raw qiymatni faqat validatsiyadan keyin domain type’ga aylantiradi; unsafe constructor tor modul ichida saqlanadi.
Bog‘liq tushunchalar
Type system, Static typing, Dynamic typing, Type inference, Generics, Subtyping, Null safety