Generic interface va type alias

~15 daq · TypeScript · Generics

API javob tuzilmasi har safar bir xil — faqat data qismi o'zgaradi: gohida User[], gohida Product, gohida Order. Har holat uchun alohida interface yozish — takror. Generic interface bir marta yoziladi, har tur bilan ishlaydi.


Generic interface

interface ApiJavob<T> {
  data:    T;
  status:  number;
  xabar:   string;
}

T — tur parametri. Ishlatishda aniqlanadi:

type Foydalanuvchi = { id: number; ism: string };

const javob: ApiJavob<Foydalanuvchi> = {
  data:   { id: 1, ism: "Jasur" },
  status: 200,
  xabar:  "OK",
};

javob.data.ism; // ✅ string

Generic type alias

type bilan ham bir xil:

type Javob<T> = {
  data:    T;
  status:  number;
  loading: boolean;
};

type Xato<T = string> = { // default tur
  xabar: T;
  kod:   number;
};

const xato: Xato = { xabar: "Topilmadi", kod: 404 };
// T=string (default)

const xato2: Xato<Error> = { xabar: new Error("..."), kod: 500 };

Generic interface — bir nechta parametr

interface Juft<Birinchi, Ikkinchi> {
  birinchi: Birinchi;
  ikkinchi: Ikkinchi;
}

const juft: Juft<string, number> = { birinchi: "Ali", ikkinchi: 25 };

Amaliy — Pagination

interface Sahifalangan<T> {
  items:      T[];
  jami:       number;
  sahifa:     number;
  sahifaHajm: number;
}

type FoydalanuvchilarJavob = Sahifalangan<Foydalanuvchi>;

const javob: FoydalanuvchilarJavob = {
  items:      [{ id: 1, ism: "Ali" }],
  jami:       100,
  sahifa:     1,
  sahifaHajm: 10,
};

Generic va extends

Interface meros olganda tur parametri uzatiladi:

interface OqiladiBazasi<T> {
  olish(id: number): Promise<T>;
  barchasi():       Promise<T[]>;
}

interface FoydalanuvchiBazasi extends OqiladiBazasi<Foydalanuvchi> {
  emailBilan(email: string): Promise<Foydalanuvchi | null>;
}

Tez-tez uchraydigan xatolar

Generic parametrni ko'rsatmaslik:

interface Javob<T> { data: T; }

const j: Javob = { data: "..." }; // ❌ — T ko'rsatilmagan
const j: Javob<string> = { data: "..." }; // ✅

Xulosa

// Generic interface
interface ApiJavob<T> {
  data:   T;
  status: number;
}

// Generic type alias
type Javob<T> = { data: T; xabar: string };

// Default tur
type Xato<T = string> = { xabar: T };

// Ishlatish
const j: ApiJavob<User>    = { data: user, status: 200 };
const j: ApiJavob<User[]>  = { data: users, status: 200 };

Keyingi dars

35-dars: Generic class — tur parametrli sinflar