Parametr/qaytish turlari, optional/default/rest parametrlar, function overloads va contextual typing — chuqur test va debugging mashqlari bilan.
TypeScript'da funksiyalarni tiplashning ko'plab qirralari bor — parametr turlaridan tortib, funksiya overload'lari va this tipigacha. Bu bob — ularning barchasini keng va chuqur yoritadi.
index.tsTypeScriptfunction add(a: number, b: number): number {return a + b;}// Arrow functionconst multiply = (a: number, b: number): number => a * b;// Funksiya turi (type alias sifatida)type MathOperation = (a: number, b: number) => number;const subtract: MathOperation = (a, b) => a - b;
index.tsTypeScriptfunction greet(name: string, greeting?: string): string {return `${greeting ?? "Salom"}, ${name}!`;}greet("Abbosbek"); // "Salom, Abbosbek!"greet("Abbosbek", "Xayrli tong"); // "Xayrli tong, Abbosbek!"function createUser(name: string, role: string = "user"): object {return { name, role };}createUser("Vali"); // role — avtomatik "user"
⚠️ Common Mistake
Optional parametrlarni majburiy parametrlardan OLDIN joylashtirish — bu xato beradi:
index.tsTypeScriptfunction invalid(a?: number, b: number) {} // XATO: majburiy parametr ixtiyoriydan keyin kelmasligi kerak
index.tsTypeScriptfunction sum(...numbers: number[]): number {return numbers.reduce((total, n) => total + n, 0);}sum(1, 2, 3, 4); // 10function logInfo(message: string, ...details: string[]): void {console.log(message, details.join(", "));}
Function overload — bitta funksiya nomiga, turli parametr kombinatsiyalari uchun bir nechta "imzo" (signature) berish imkonini beradi. Bu funksiya turli argument turlari bilan chaqirilganda, qaytish turi ham mos ravishda o'zgarishi kerak bo'lgan holatlarda foydali.
index.tsTypeScriptfunction getLength(value: string): number;function getLength(value: unknown[]): number;function getLength(value: string | unknown[]): number {return value.length;}getLength("salom"); // 5 — string overloadgetLength([1, 2, 3]); // 3 — array overloadgetLength(42); // XATO: 42 hech qanday overload'ga mos kelmaydi
💡 Key Idea
Birinchi ikki qator — "overload signatures" (faqat e'lon, implementatsiyasiz). Uchinchi qator — "implementation signature", u ikkalasini ham qamrab oluvchi union type bilan yoziladi va haqiqiy kod mantig'ini o'z ichiga oladi.
Task: Ikki sonni qo'shuvchi, ixtiyoriy uchinchi sonni ham qabul qiladigan (default qiymat bilan) funksiya yozing.
Task: Istalgan sonli argumentlarni qabul qilib, ularning o'rtachasini hisoblovchi average(...numbers: number[]) funksiyasini yozing.
Task: parseValue funksiyasi uchun overload'lar yozing: agar string berilsa number qaytarsin (parse qilib), agar number berilsa uni o'zgarishsiz qaytarsin.
index.tsTypeScriptfunction createPair(a: number, b?: number) {return [a, b];}const pair = createPair(5);console.log(pair[1].toFixed(2));
🧠 Think first! Bu compile vaqtida xato beradimi?
<details> <summary>Answer</summary> Ha, xato beradi: `Object is possibly 'undefined'`.Why?
b — optional parametr, uning turi number | undefined. pair[1] — shuning uchun number | undefined turida, va undefinedda .toFixed() metodi mavjud emas. Bu — optional parametrlarning "yashirin" xavfini ko'rsatadi: ular butun kod zanjiri bo'ylab | undefinedni "tarqatadi".
index.tsTypeScriptfunction processItems(items: string[], callback: (item: string) => void) {for (const item of items) {callback(item);}}processItems(["a", "b"], (item: number) => console.log(item));
Your Task: Bu kod nega xato beradi?
<details> <summary>Solution</summary> `callback` parametri — `(item: string) => void` turida kutilmoqda, lekin uzatilgan funksiya `(item: number) => void` turida. TypeScript funksiya turlarini "moslikni" tekshiradi — parametr turlari mos kelmasa, xato beriladi: ``` Argument of type '(item: number) => void' is not assignable to parameter of type '(item: string) => void'. ``` Yechim — callback parametrining turini `string` qilish yoki umuman tur yozmaslik (TypeScript kontekstdan xulosa chiqaradi): ```typescript processItems(["a", "b"], (item) => console.log(item)); // TO'G'RI — 'item' avtomatik 'string' deb xulosa chiqariladi ``` </details>Funksiyalar — parametr va qaytish turlari, optional/default parametrlar, rest parametrlar va overload'lar orqali chuqur tiplanishi mumkin. Contextual typing — TypeScript'ga kontekstdan kelib chiqib parametr turlarini xulosa chiqarish imkonini beradi.
?) — majburiylardan keyin joylashadi va | undefined qo'shadiundefined bo'lmaydi...) — cheksiz sondagi bir xil turdagi argumentlar uchunindex.tsTypeScriptfunction f(a: number, b?: string): void {}function g(a: number, b: string = "x"): void {}function h(...rest: number[]): number { return rest.length; }function parse(v: string): number;function parse(v: number): number;function parse(v: string | number): number { return Number(v); }
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 / 3 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: