TypeScript Utility Types: Pick, Omit, Partial — Praktiki Nümunələr
TypeScript-in ən çox istifadə olunan utility type-ları real layihə nümunələri ilə. Bakıda interview-da soruşulan sualların cavabları burada.
TypeScript Utility Types: Pick, Omit, Partial — Praktiki Nümunələr
Salam, developer dostum! Əgər Bakıda front-end və ya full-stack iş axtarırsan, TypeScript artıq "bilsən yaxşı olar" deyil — tələbdir. ABB, Kapital Bank, PASHA Holding, Bravo kimi şirkətlərin vakansiyalarına bax: demək olar ki, hamısında TypeScript yazılıb. LinkedIn-də "TypeScript Baku" axtarışı etsən, orta maaş 1500-3500 AZN arasında dəyişən pozisiyalar görəcəksən. Senior səviyyədə isə bu rəqəm 4000+ AZN-ə çıxır.
Bu gün sənə TypeScript-in ən praktiki silahlarından üçünü öyrədəcəm: Pick, Omit və Partial. Bunlar utility type-lardır — yəni TypeScript-in özünün sənə verdiyi hazır alətlər. Onları başa düşsən, kodun həm təmiz, həm də təhlükəsiz olacaq.
Niyə Utility Types?
Təsəvvür et ki, e-commerce layihə yazırsan — məsələn, lokal bir startup üçün. Sənin User modelində 15 field var. Amma profil redaktə səhifəsində cəmi 4-ü lazımdır. Bütün 15 field-i yenidən yazmaq? Əlbəttə yox. Məhz burada utility type-lar işə düşür.
Stack Overflow-nun 2025-ci il Developer Survey-inə görə, TypeScript istifadə edən developer-lərin 87%-i utility type-lardan müntəzəm istifadə edir. Ən populyar üçlük isə məhz Partial, Pick və Omit-dir.
1. Pick — "Mənə yalnız bunlar lazımdır"
Pick<Type, Keys> — mövcud type-dan yalnız istədiyin field-ləri seçirsən.
Real ssenari: İstifadəçi kartı komponenti
Tutaq ki, PASHA Life-ın müştəri paneli üçün işləyirsən:
typescriptinterface User { id: number; fullName: string; email: string; phone: string; address: string; finCode: string; balance: number; createdAt: Date; } // Sidebar-da yalnız ad və email göstərmək lazımdır type UserCard = Pick<User, 'fullName' | 'email'>; // Nəticə: // type UserCard = { // fullName: string; // email: string; // } const renderCard = (user: UserCard) => { console.log(`${user.fullName} — ${user.email}`); };
Nə qazandıq? UserCard type-ı yalnız lazım olan field-ləri saxlayır. Əgər sabah User-ə yeni field əlavə olunsa, UserCard avtomatik təmiz qalır. Komponent lazımsız data ilə şişmir.
2. Omit — "Bunlardan başqa hamısı lazımdır"
Omit<Type, Keys> — Pick-in əksidir. Hansı field-ləri istəmədiyini deyirsən, qalanları qalır.
Real ssenari: Yeni istifadəçi yaratmaq
API-yə POST sorğu göndərəndə id və createdAt server tərəfdən yaranır. Onları forma type-ından çıxarmalıyıq:
typescriptinterface User { id: number; fullName: string; email: string; phone: string; address: string; finCode: string; balance: number; createdAt: Date; } // Yeni user yaradanda id və createdAt lazım deyil type CreateUserDTO = Omit<User, 'id' | 'createdAt'>; const createUser = async (data: CreateUserDTO) => { const response = await fetch('/api/users', { method: 'POST', body: JSON.stringify(data), }); return response.json(); }; // İstifadə createUser({ fullName: 'Əli Həsənov', email: 'ali@example.az', phone: '+994501234567', address: 'Bakı, Nəsimi rayonu', finCode: '1A2B3C4', balance: 0, });
Nə vaxt Pick, nə vaxt Omit? Sadə qayda: əgər saxlamaq istədiyin field-lər azdırsa — Pick. Çıxarmaq istədiyin field-lər azdırsa — Omit.
3. Partial — "Heç biri məcburi deyil"
Partial<Type> — bütün field-ləri optional (?) edir. Update əməliyyatları üçün əvəzsizdir.
Real ssenari: Profil yeniləmə
İstifadəçi yalnız telefon nömrəsini dəyişmək istəyir. Bütün field-ləri göndərməyə ehtiyac yoxdur:
typescripttype UpdateUserDTO = Partial<Omit<User, 'id' | 'createdAt'>>; // Nəticə: bütün field-lər optional oldu // type UpdateUserDTO = { // fullName?: string; // email?: string; // phone?: string; // address?: string; // finCode?: string; // balance?: number; // } const updateUser = async (id: number, data: UpdateUserDTO) => { const response = await fetch(`/api/users/${id}`, { method: 'PATCH', body: JSON.stringify(data), }); return response.json(); }; // Yalnız telefonu yeniləyirik updateUser(42, { phone: '+994551112233' }); // Və ya yalnız ünvanı updateUser(42, { address: 'Bakı, Yasamal' });
Diqqət et: burada Partial və Omit-i birlikdə istifadə etdik. Bu, real layihələrdə çox rast gəlinən pattern-dir.
Bonus: Hamısını birlikdə istifadə et
Gəl tam bir CRUD type sistemi quraq:
typescriptinterface Product { id: number; name: string; price: number; category: string; imageUrl: string; stock: number; createdAt: Date; updatedAt: Date; } // Məhsul yaratmaq üçün type CreateProductDTO = Omit<Product, 'id' | 'createdAt' | 'updatedAt'>; // Məhsul yeniləmək üçün type UpdateProductDTO = Partial<CreateProductDTO>; // Məhsul siyahısında göstərmək üçün type ProductListItem = Pick<Product, 'id' | 'name' | 'price' | 'imageUrl'>; // Axtarış nəticəsində type ProductSearchResult = Pick<Product, 'id' | 'name' | 'category'>;
4 sətir type — və bütün CRUD əməliyyatları üçün type-safe strukturun hazırdır. Heç bir dublikat yoxdur.
Interview-da nə soruşurlar?
Bakıdakı texnoloji şirkətlərdə TypeScript interview-larında bu suallar populyardır:
- "Pick və Omit arasında fərq nədir?" — Pick saxlayır, Omit çıxarır.
- "Partial nə edir?" — Bütün property-ləri optional edir.
- "Required nədir?" — Partial-ın əksi, hamısını məcburi edir.
- "Real layihədə harada istifadə etmisən?" — DTO pattern-ini izah et, yuxarıdakı nümunələri ver.
Xülasə
| Utility Type | Nə edir | Nə vaxt istifadə et |
|---|---|---|
Pick | Seçilmiş field-ləri saxlayır | Komponent props, siyahı görünüşü |
Omit | Seçilmiş field-ləri çıxarır | DTO yaratmaq, server field-ləri ayırmaq |
Partial | Hamısını optional edir | Update/PATCH əməliyyatları |
Bu üç utility type-ı mənimsəsən, TypeScript kodun daha təmiz, daha təhlükəsiz və daha maintainable olacaq. Bakıda interview-a gedəndə bu biliklər sənə real üstünlük verəcək.
Kodu yaz, type-ları düzgün qur, qalan hissəsini TypeScript compiler özü yoxlasın. Uğurlar, developer! 🚀
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ə.
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.