TypeScript / Type ба Interface ялгаа

Type ба Interface ялгаа

TypeScript-д өгөгдлийн бүтцийг тодорхойлох хоёр арга байдаг: type alias ба interface. Хоёулаа маш төстэй боловч чухал ялгаатай талуудтай. Энэ хичээлд тэдгээрийг хэзээ, хэрхэн ашиглахыг сурна.

Үндсэн синтакс

Хоёулаа объектын бүтцийг тодорхойлж чаддаг:

typescript
// interface ашиглан
interface Хэрэглэгч {
  нэр: string;
  нас: number;
  имэйл: string;
}

// type ашиглан
type Хэрэглэгч = {
  нэр: string;
  нас: number;
  имэйл: string;
};

// Хоёулаа адилхан хэрэглэгддэг
const хэрэглэгч: Хэрэглэгч = {
  нэр: "Болд",
  нас: 25,
  имэйл: "bold@example.com",
};

Ийм энгийн тохиолдолд хоёрын хооронд ялгаа байхгүй. Гэхдээ илүү нарийн тохиолдолд ялгаа гарч ирдэг.

Interface-ийн давуу тал: өвлөлт ба нэмэлт

interface нь extends ашиглан өргөжүүлэх боломжтой:

typescript
interface Амьтан {
  нэр: string;
  нас: number;
}

interface Нохой extends Амьтан {
  үүлдэр: string;
}

interface Тэжээвэр extends Амьтан {
  эзэн: string;
}

// Interface нэгтгэх — Declaration Merging
interface Хэрэглэгч {
  нэр: string;
}

interface Хэрэглэгч {
  нас: number; // TypeScript хоёрыг автоматаар нийлүүлнэ
}

const х: Хэрэглэгч = { нэр: "Болд", нас: 25 }; // Алдаагүй!

Declaration Merging гэдэг нь нэг нэртэй хоёр interface автоматаар нэгтгэгддэг онцлог юм. Энэ нь type-д байдаггүй — нэг нэртэй хоёр type тодорхойлбол алдаа гарна.

Type-ийн давуу тал: уян хатан тодорхойлолт

type нь interface-аас илүү олон зүйлийг илэрхийлж чаддаг:

typescript
// Union type — interface-ээр хийж болохгүй
type Үр дүн = "амжилттай" | "амжилтгүй" | "хүлээгдэж байна";

// Intersection type
type Ажилтан = Хэрэглэгч & {
  ажилтны дугаар: number;
};

// Primitive type alias
type Мөр = string;
type Тоо = number;

// Tuple
type Координат = [number, number];
const цэг: Координат = [47.9, 106.9]; // Улаанбаатарын координат

// Function type
type Нэмэх = (а: number, б: number) => number;

interface нь зөвхөн объектын бүтцийг тодорхойлдог. Харин type нь дурын төрлийг нэрлэж болдог.

Харьцуулсан хүснэгт

| Шинж чанар | interface | type | | ------------------- | ----------- | ------------ | | Объект тодорхойлох | Тийм ✅ | Тийм ✅ | | extends ашиглах | Тийм ✅ | & ашиглана | | Declaration Merging | Тийм ✅ | Үгүй ❌ | | Union тодорхойлох | Үгүй ❌ | Тийм ✅ | | Primitive нэрлэх | Үгүй ❌ | Тийм ✅ | | Tuple тодорхойлох | Үгүй ❌ | Тийм ✅ |

Хэзээ аль нэгийг ашиглах вэ?

Практик дүрэм:

typescript
// ✅ interface — объект, класс, React props-д хэрэглэ
interface ButtonProps {
  шошго: string;
  дарагдсан: () => void;
  идэвхгүй?: boolean;
}

// ✅ type — union, intersection, primitive-д хэрэглэ
type Өнгө = "улаан" | "ногоон" | "цэнхэр";
type Хариу =
  | { амжилттай: true; өгөгдөл: string }
  | { амжилттай: false; алдаа: string };

TypeScript-ийн баг болон томоохон төслүүд (React, Angular) ерөнхийдөө объектод interface, бусад тохиолдолд type хэрэглэхийг санал болгодог. Гэхдээ хамгийн чухал зүйл бол нэг байдлаар хэрэглэх — аль нэгийг сонгоод тогтмол мөрд хэрэглэ.

Дараагийн хичээлд:

Функцийн параметр, буцаах утга болон callback-д яг ямар төрлүүдийг хэрхэн тодорхойлохыг сурна.