Inline object types, structural typing (duck typing) tamoyili, excess property checks va index signatures — chuqur test va debugging mashqlari bilan.
TypeScript'ning tip tizimi — "structural typing" (strukturaviy tiplash) tamoyiliga asoslangan, bu boshqa ko'p tillardagi "nominal typing"dan tubdan farq qiladi. Bu bob — bu farqni va uning amaliy oqibatlarini chuqur yoritadi.
index.tsTypeScriptfunction printUser(user: { name: string; age: number }) {console.log(`${user.name}, ${user.age} yosh`);}printUser({ name: "Abbosbek", age: 26 });let config: { apiUrl: string; timeout: number; debug?: boolean } = {apiUrl: "https://api.example.com",timeout: 5000,};
TypeScript'da ikkita tur "mos" hisoblanadi, agar ularning STRUKTURASI (maydonlari) mos kelsa — nomi bir xil bo'lishi SHART emas. Bu — "agar u o'rdakday yursa va o'rdakday g'ag'illasa, u o'rdak" (duck typing) tamoyiliga o'xshaydi.
index.tsTypeScriptinterface Point2D {x: number;y: number;}function printPoint(point: Point2D) {console.log(`(${point.x}, ${point.y})`);}// Bu obyekt Point2D deb E'LON QILINMAGAN, lekin strukturasi mos keladiconst coord = { x: 10, y: 20, z: 30 };printPoint(coord); // TO'G'RI ISHLAYDI! Ortiqcha 'z' maydoni muammo emas
💡 Key Idea
Bu — Java yoki C# kabi "nominal typing" tillaridan TUBDAN farq qiladi, u yerda obyekt aniq interfeys/klassni "implement" qilishi (e'lon qilishi) SHART. TypeScript'da esa faqat struktura (shakl) mos kelishi kifoya.
Agar obyekt LITERAL sifatida (to'g'ridan-to'g'ri, o'zgaruvchisiz) funksiyaga uzatilsa, TypeScript qo'shimcha, qattiqroq tekshiruv — "excess property check" (ortiqcha xususiyat tekshiruvi) o'tkazadi.
index.tsTypeScriptinterface Config { apiUrl: string; }function setup(config: Config) { }setup({ apiUrl: "https://x.com", timeout: 5000 });// XATO: Object literal may only specify known properties,// and 'timeout' does not exist in type 'Config'const myConfig = { apiUrl: "https://x.com", timeout: 5000 };setup(myConfig); // TO'G'RI ISHLAYDI — chunki bu structural typing (excess check yo'q)
⚠️ Common Mistake
Bu ikki xil xatti-harakatni (to'g'ridan-to'g'ri literal vs oldindan saqlangan o'zgaruvchi) chalkashtirish — ko'p yangi boshlovchilarni hайрон qoldiradi, chunki mantiqan ular bir xil obyektga o'xshaydi, lekin TypeScript ularga boshqacha munosabatda bo'ladi.
Index signature — obyektning KALITLARI oldindan noma'lum bo'lgan, lekin ularning QIYMAT TURI ma'lum bo'lgan holatlar uchun ishlatiladi (masalan lug'at/dictionary kabi obyektlar).
index.tsTypeScriptinterface StringDictionary {[key: string]: string;}const translations: StringDictionary = {hello: "salom",goodbye: "xayr",};translations["thanks"] = "rahmat"; // TO'G'RI — istalgan string kalit qo'shish mumkintranslations["count"] = 5; // XATO: qiymat 'string' bo'lishi kerak
Task: { latitude: number; longitude: number } inline turiga ega parametr qabul qiluvchi printLocation funksiyasini yozing.
Task: Turli tillardagi tarjimalarni saqlovchi, index signature'ga ega Translations interfeysini yarating.
index.tsTypeScriptinterface ApiConfig {url: string;retries: number;}function callApi(config: ApiConfig) {console.log(config.url, config.retries);}const settings = { url: "https://api.com", retries: 3, timeout: 5000 };callApi(settings);callApi({ url: "https://api.com", retries: 3, timeot: 5000 }); // yozuv xatosi bilan
Your Task: Ikkita chaqiruvdan qaysi biri xato beradi, va nega?
<details> <summary>Solution</summary> Faqat IKKINCHI chaqiruv xato beradi — `timeot` (yozuv xatosi bilan, `timeout` emas) — bu to'g'ridan-to'g'ri obyekt literal bo'lgani uchun excess property check ishga tushadi va noma'lum `timeot` xususiyatini aniqlaydi. Birinchi chaqiruv (`settings` orqali) esa muammosiz ishlaydi, chunki `settings` — oldindan e'lon qilingan o'zgaruvchi, unga structural typing (faqat kerakli maydonlar mavjudligini tekshirish) qoidasi qo'llaniladi. </details>TypeScript — structural typing (strukturaviy tiplash) tamoyiliga asoslangan: turlar nomiga emas, strukturasiga qarab solishtiriladi. Excess property check — literal obyektlarda qo'shimcha, qattiqroq tekshiruv o'tkazadi. Index signature — dinamik kalitli, bir xil qiymat turiga ega obyektlar uchun ishlatiladi.
index.tsTypeScriptfunction f(obj: { x: number; y: number }) {}interface Dict { [key: string]: number; }const d: Dict = { a: 1, b: 2 };
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 2 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: