TypeScript Generics — Nədir, Niyə Lazımdır, Necə İstifadə Olunur?
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:
typescriptfunction 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ə:
typescriptfunction 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:
typescriptinterface 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çirOmit<T, K>— müəyyən field-ləri çıxarırRecord<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
mergefunksiyası yaz ki, iki obyekti birləşdirsin və nəticənin tipi hər ikisinin birləşməsi olsun."
Cavab:
typescriptfunction 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:
- Eyni məntiqi müxtəlif tiplərlə təkrarlayırsan → generic yaz
anyyazmaq istəyirsən → dayan, generic düşün- Reusable library/komponent yazırsan → mütləq generic
- 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
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 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ə.
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.