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

  1. Book tipini e’lon qiling: id, title, author, year maydonlari bilan;
  2. Partial<Book> yordamida updateBook funksiyasini yozing va uni bitta maydon bilan chaqiring;
  3. Pick<Book, "id" | "title"> tipini yasab, unga qo’shimcha maydon berib TS2353 xatosini oling;
  4. Omit<Book, "year"> tipini yozing va Pick bilan bir xil natija beradigan variantini tuzing;
  5. Record<"new" | "used", string> tipini e’lon qilib, bitta kalitni tushirib qoldiring va TS2741 xatosini o’qing;
  6. 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 Pick xavfsizroq: 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.

Bu dars foydali bo'ldimi?

marta ko'rildi