TypeScript utility tiplar: Partial, Pick, Omit
User tipi e’lon qilingan. Endi shunga o’xshash, lekin biroz boshqacha
tiplar kerak bo’ladi: tahrirlash formasi uchun hamma maydon ixtiyoriy
bo’lgan variant, ro’yxat uchun faqat ikki maydonli variant, javob uchun
parolsiz variant.
Ularni qo’lda qayta yozish mumkin, lekin User o’zgarganda hammasini
qo’lda yangilashga to’g’ri keladi. TypeScript’da tayyor yechim bor.
Boshlang’ich tip
Butun darsda shu tipdan foydalanamiz:
type User = {
id: number;
name: string;
email: string;
isActive: boolean;
};
Partial — hamma maydon ixtiyoriy
type UserDraft = Partial<User>;
const draft: UserDraft = { name: "Aziz" };
console.log(draft);
{ name: 'Aziz' }
Partial<User> quyidagiga teng:
type UserDraft = {
id?: number;
name?: string;
email?: string;
isActive?: boolean;
};
Eng ko’p uchraydigan ishlatilishi — yangilash funksiyasi. Foydalanuvchi bir maydonni o’zgartirsa, qolganini yuborish shart emas:
function updateUser(id: number, changes: Partial<User>): void {
console.log(`${id} yangilanmoqda:`, changes);
}
updateUser(1, { name: "Aziz Karimov" });
updateUser(2, { email: "yangi@example.uz", isActive: false });
1 yangilanmoqda: { name: 'Aziz Karimov' }
2 yangilanmoqda: { email: 'yangi@example.uz', isActive: false }
Required — teskarisi
Required<T> barcha ixtiyoriy maydonlarni majburiy qiladi:
type RequiredUser = Required<UserDraft>;
const full: RequiredUser = {
id: 1,
name: "Aziz",
email: "aziz@example.uz",
isActive: true,
};
console.log(full.email);
aziz@example.uz
Bitta maydon tushib qolsa, xato chiqadi.
Pick — kerakli maydonlarni tanlash
type UserPreview = Pick<User, "id" | "name">;
const preview: UserPreview = { id: 1, name: "Aziz" };
console.log(preview);
{ id: 1, name: 'Aziz' }
Ikkinchi parametr — tanlanadigan maydon nomlari. Ular literal union shaklida yoziladi; bu yozuvni union va literal darsida ko’rgansiz.
Pick ro’yxat ko’rinishlari uchun qulay: jadvalda faqat ikki ustun
kerak bo’lsa, butun User ni uzatish shart emas.
Omit — keraksizni olib tashlash
type PublicUser = Omit<User, "email">;
const publicUser: PublicUser = { id: 1, name: "Aziz", isActive: true };
console.log(publicUser);
{ id: 1, name: 'Aziz', isActive: true }
email maydonini qo’shishga urinsangiz:
example.ts(3,55): error TS2353: Object literal may only specify known properties, and 'email' does not exist in type 'PublicUser'.
Record — kalit-qiymat jadvali
Record<K, V> kalitlari K, qiymatlari V bo’lgan obyekt tipini
yasaydi:
type RoleLabels = Record<string, string>;
const roles: RoleLabels = {
admin: "Administrator",
editor: "Muharrir",
};
console.log(Object.keys(roles).join(", "));
admin, editor
Kalit sifatida literal union berilsa, foydasi ancha oshadi:
type Status = "draft" | "published" | "archived";
type StatusLabels = Record<Status, string>;
const labels: StatusLabels = {
draft: "Qoralama",
published: "Chop etilgan",
archived: "Arxivlangan",
};
console.log(labels.draft);
Qoralama
Readonly — hamma maydonni qulflash
type FrozenUser = Readonly<User>;
const user: FrozenUser = {
id: 1,
name: "Aziz",
email: "aziz@example.uz",
isActive: true,
};
user.name = "Bobur";
example.ts(17,6): error TS2540: Cannot assign to 'name' because it is a read-only property.
Obyekt tiplari darsida readonly ni
bitta maydonga qo’ygansiz. Readonly<T> uni barcha maydonlarga
qo’yadi.
Jamlangan jadval
| Utility tip | Nima qiladi |
|---|---|
Partial<T> |
Hamma maydonni ixtiyoriy qiladi |
Required<T> |
Hamma maydonni majburiy qiladi |
Pick<T, K> |
Faqat sanab o’tilgan maydonlarni oladi |
Omit<T, K> |
Sanab o’tilganlardan tashqarisini oladi |
Record<K, V> |
Kalit-qiymat jadvali yasaydi |
Readonly<T> |
Hamma maydonni o’zgarmas qiladi |
Ularni birga ishlatish
Utility tiplarni bir-birining ichiga joylash mumkin:
type EditableUser = Partial<Omit<User, "id">>;
const changes: EditableUser = { name: "Aziz Karimov" };
console.log(changes);
{ name: 'Aziz Karimov' }
Ichkaridan tashqariga o’qing: avval id olib tashlanadi, so’ng qolgan
maydonlar ixtiyoriy bo’ladi. Natijada — id dan boshqa hamma narsani
tahrirlash mumkin bo’lgan tip.
Amaliy mashq
Booktipini e’lon qiling:id,title,author,yearmaydonlari bilan;Partial<Book>yordamidaupdateBookfunksiyasini yozing va uni bitta maydon bilan chaqiring;Pick<Book, "id" | "title">tipini yasab, unga qo’shimcha maydon beribTS2353xatosini oling;Omit<Book, "year">tipini yozing vaPickbilan bir xil natija beradigan variantini tuzing;Record<"new" | "used", string>tipini e’lon qilib, bitta kalitni tushirib qoldiring vaTS2741xatosini o’qing;Partial<Omit<Book, "id">>tipini yasab, natijada qaysi maydonlar qolganini aytib bering.
5-qadam eng muhimi: Record ning to’liqlikni talab qilishi yangi
holat qo’shganda unutilgan joyni o’zi ko’rsatadi.
Qisqacha xulosa
- Utility tip — mavjud tipdan yangisini yasaydigan tayyor generik.
Partial<T>maydonlarni ixtiyoriy,Required<T>majburiy qiladi.Pick<T, K>kerakligini tanlaydi,Omit<T, K>keraksizini olib tashlaydi.- Maxfiy maydonlarni yashirishda
Pickxavfsizroq: yangi maydon jim turib ochilib qolmaydi. Record<K, V>kalit-qiymat jadvali yasaydi va barcha kalitlarni talab qiladi.Readonly<T>barcha maydonlarni qulflaydi.- Ularni ichma-ich ishlatish mumkin; asosiy foyda — bitta haqiqat manbai.
Keyingi darsda DOM va tiplar — sahifa
elementlari bilan ishlash va strictNullChecks.