Blog/typescript/TypeScript Generics — Nədir, Niyə Lazımdır, Necə İstifadə Olunur?
typescript

TypeScript Generics — Nədir, Niyə Lazımdır, Necə İstifadə Olunur?

B
Baku Stack AI
·6 aprel 2026·4 dəq oxuma·16 baxış
typescript.ascii
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ ■ ■ ■ TYPESCRIPT ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ function id<T>(x:T):T ▓
▓ return x; ▓
▓ ▓
▓ ● id<string>("Bakı") ▓
▓ → "Bakı" ✓ ▓
▓ ● id<number>(2026) ▓
▓ → 2026 ✓ ▓
▓ ▓
▓ Generics skill: ▓
▓ ▓▓▓▓▓▓▓▓░░ 80% ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓

TypeScript generics-i başa düşmək Bakıda frontend və backend vakansiyaların 70%-ində tələb olunan skilldir. Bu bələdçi ilə generics-i bir dəfəlik öyrən.

TypeScript Generics — Azərbaycan Developer-ləri Üçün İzahlı Bələdçi

Salam, developer dostum. Əgər LinkedIn-də Bakıdakı vakansiyalara baxırsansa, artıq görmüsən: Kapital Bank, ABB, Pasha Holding, ASAN Xidmət layihələri, eləcə də onlarla outsource şirkət — hamısı TypeScript tələb edir. Sadəcə TypeScript bilmək deyil, generics səviyyəsində bilmək. 2026-cı ildə Bakıda mid-level frontend developer maaşı 1800-3500 AZN arasında dəyişir, amma generics, utility types və type-safe architecture bilən senior developer 4000-7000 AZN alır. Fərq böyükdür. Bu məqalə ilə generics-i bir dəfəlik, düzgün öyrənəcəksən.


Generics Nədir? Sadə Dildə

Təsəvvür et ki, çay stəkanın var. Bu stəkana çay da tökə bilərsən, su da, kompot da. Stəkan — generic-dir, içindəki maye — type-dır. Proqramlaşdırmada generics eyni funksiyanı və ya komponenti müxtəlif tiplər üçün təkrar istifadə etməyə imkan verir, amma type safety-ni itirmədən.

Generics olmadan belə yazırsan:

typescript
function getFirst(arr: any[]): any { return arr[0]; }

any istifadə edəndə TypeScript-in bütün gücünü itirirsən — IDE sənə autocomplete vermir, bug-lar runtime-da çıxır. Generics ilə isə:

typescript
function getFirst<T>(arr: T[]): T { return arr[0]; } const name = getFirst<string>(["Orxan", "Leyla", "Nigar"]); // string const age = getFirst<number>([25, 30, 22]); // number

Burada <T> — type parametridir. Funksiyanı çağıranda hansı tipi göndərirsən, nəticə də həmin tipdə olur. Compile-time-da xəta tutur, runtime-da sürpriz olmur.


Real Layihə Nümunəsi: API Response Wrapper

Bakıda işləyən hər developer backend-dən gələn API cavablarını handle edir. Gəl real bir nümunəyə baxaq — Pasha Bank-ın mobil tətbiqi tipli bir layihədə API response-ları belə ola bilər:

typescript
// Generic API response interface interface ApiResponse<T> { success: boolean; data: T; message: string; timestamp: number; } // User modeli interface User { id: number; name: string; email: string; balanceAZN: number; } // Transaction modeli interface Transaction { id: string; amount: number; currency: "AZN" | "USD" | "EUR"; date: string; } // Fetch funksiyaları — eyni wrapper, fərqli tiplər async function fetchUser(id: number): Promise<ApiResponse<User>> { const res = await fetch(`/api/users/${id}`); return res.json(); } async function fetchTransactions( userId: number ): Promise<ApiResponse<Transaction[]>> { const res = await fetch(`/api/users/${userId}/transactions`); return res.json(); } // İstifadə const userResponse = await fetchUser(42); console.log(userResponse.data.balanceAZN); // ✓ autocomplete işləyir console.log(userResponse.data.phone); // ✗ XƏTA — compile-time-da tutur

Gördüyün kimi, ApiResponse<T> bir dəfə yazılıb, amma User, Transaction, Product — istənilən modellə işləyir. Əgər backend-dən 15 fərqli endpoint-dən data gəlirsə, 15 dəfə response interface yazmırsan. Bir generic — hamısı üçün.


Generic Constraints — Hər Şeyi Buraxma

Bəzən generic-ə məhdudiyyət qoymaq lazımdır. Məsələn, yalnız id property-si olan obyektlər qəbul etmək istəyirsən:

typescript
interface HasId { id: number | string; } function findById<T extends HasId>(items: T[], id: T["id"]): T | undefined { return items.find(item => item.id === id); } const users: User[] = [ { id: 1, name: "Rəşad", email: "rashad@mail.az", balanceAZN: 1250 }, { id: 2, name: "Günay", email: "gunay@mail.az", balanceAZN: 3400 }, ]; const found = findById(users, 1); // User | undefined — tip doğrudur

T extends HasId — bu constraint-dir. Deyir ki, T nə olursa olsun, id property-si olmalıdır. Olmasa, compile xətası verir.


Utility Types — Generics-in Hazır Silahları

TypeScript-in built-in utility type-ları hamısı generics üzərində qurulub. Ən çox istifadə olunanlar:

  • Partial<T> — bütün property-ləri optional edir (form update üçün ideal)
  • Pick<T, K> — yalnız lazımlı field-ləri seçir
  • Omit<T, K> — müəyyən field-ləri çıxarır
  • Record<K, V> — key-value map yaradır
typescript
// User-i update edəndə bütün field-lər məcburi olmamalıdır function updateUser(id: number, updates: Partial<User>): void { // yalnız göndərilən field-lər update olunur } updateUser(1, { balanceAZN: 2000 }); // ✓ yalnız balans update // Yalnız ad və email lazımdır type UserPreview = Pick<User, "name" | "email">;

Müsahibə Sualı: Bakıda Soruşulan Real Sual

Bir neçə ay əvvəl Bakıdakı bir fintech şirkətin müsahibəsində belə sual verilib:

"Generic bir merge funksiyası yaz ki, iki obyekti birləşdirsin və nəticənin tipi hər ikisinin birləşməsi olsun."

Cavab:

typescript
function merge<T extends object, U extends object>(a: T, b: U): T & U { return { ...a, ...b }; } const result = merge( { name: "Tural", city: "Bakı" }, { age: 27, stack: "React" } ); console.log(result.name); // ✓ string console.log(result.age); // ✓ number console.log(result.stack); // ✓ string

Bu tip suallar Azerconnect, PASHA Technology, Crocusoft, Algorithmics kimi şirkətlərdə tez-tez soruşulur.


Generics-i Nə Vaxt İstifadə Etməli?

Sadə qayda:

  1. Eyni məntiqi müxtəlif tiplərlə təkrarlayırsan → generic yaz
  2. any yazmaq istəyirsən → dayan, generic düşün
  3. Reusable library/komponent yazırsan → mütləq generic
  4. Bir dəfəlik sadə funksiya → generic lazım deyil, overengineer etmə

Nəticə: Bu Gün Başla

Generics TypeScript-in ən güclü silahıdır. Bakıda 2026-cı ildə iş tapmaq istəyən hər developer generics-i bilməlidir — bu artıq "nice to have" deyil, "must have"-dir. Bu məqalədəki nümunələri VS Code-da aç, özün yaz, dəyiş, sındır. Ən yaxşı öyrənmə yolu əlini çirkləndirməkdir.

Sualların varsa, şərhlərdə yaz — Baku Stack icması həmişə kömək etməyə hazırdır. 🚀

— Baku Stack redaksiyası, 6 aprel 2026

Oxşar məqalələr

typescript.ascii
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ ■ ■ ■ TYPESCRIPT ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ z.string() ✓ safe ▓
▓ z.number() ✓ safe ▓
▓ z.enum() ✓ safe ▓
▓──────────────────────▓
▓ API data → unknown ▓
▓ ↓ safeParse() ▓
▓ ↓ validate ▓▓▓▓░░░ ▓
▓ ↓ result.success ▓
▓ ✓ typed & safe! ▓
▓ ● runtime: 100% ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓

Zod ilə TypeScript Runtime Validasiyası: Bugları Production-da Deyil, Əvvəlcədən Tut

TypeScript compile-time-da tip yoxlayır, amma runtime-da API-dən gələn datanı kim yoxlayacaq? Zod ilə validasiyanı necə həll edəcəyini real nümunələrlə göstərirəm.

typescript.ascii
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ ■ ■ ■ TYPESCRIPT ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ supabase gen types ▓
▓ ▓▓▓▓▓▓▓▓▓▓▓▓░░░ 80% ▓
▓ ▓
▓ → Database → Types ▓
▓ → Types → Client ▓
▓ → Client → IDE ✓ ▓
▓ ▓
▓ ● Row ● Insert ▓
▓ ● Update ● Delete ▓
▓ type safety: 100% ✓ ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓

TypeScript ilə Supabase inteqrasiyası — tam tip təhlükəsizliyi

Supabase + TypeScript birlikdə işlədəndə runtime xətaları minimuma enir. Database-dən gələn hər sətir tipli olur. Necə? Bu məqalədə.

typescript.ascii
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ ■ ■ ■ FINTECH TS ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ $ npm init fintech ▓
▓ ● TypeScript ✓ ON ▓
▓ ● NestJS ✓ ON ▓
▓ ● Strict ✓ ON ▓
▓──────────────────────▓
▓ Type Safety: ▓
▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓░ 95% ▓
▓ AZN Bug Risk: ▓
▓ ▓▓░░░░░░░░░░░░ 8% ▓
▓ → Maaş: 4500+ AZN ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓

Azərbaycan Fintech Startaplarında TypeScript: Niyə 2026-da Bu Bacarıq Sənə Lazımdır

Bakıda fintech sektoru böyüyür, TypeScript bilikli developer-lərə tələbat artır. Real kod nümunələri və maaş rəqəmləri ilə niyə indi keçid etməli olduğunu izah edirik.

← Bloqa qayıt