TypeScript / Type Alias

Type Alias

Өмнөх хичээлүүдэд string | number эсвэл { нэр: string; нас: number } зэрэг төрлүүдийг шууд бичиж байсан. Томоохон кодонд нэг төрлийг олон газар давтан бичвэл хүнд болдог. Type alias ашигласнаар төрлийг нэг удаа тодорхойлж, хаана ч дахин ашиглана.

Type Alias үндэс

type түлхүүр үгийг ашиглан өөрийн нэртэй төрөл үүсгэнэ:

typescript
// Alias-гүйгээр — давтагдана
function хэрэглэгч харах(хэрэглэгч: { нэр: string; нас: number; и_мэйл: string }): void {
  console.log(хэрэглэгч.нэр);
}

function хэрэглэгч шинэчлэх(хэрэглэгч: { нэр: string; нас: number; и_мэйл: string }): void {
  // ...
}

// Type alias-тай — нэг удаа тодорхойлно
type Хэрэглэгч = {
  нэр: string;
  нас: number;
  и_мэйл: string;
};

function хэрэглэгч харах(хэрэглэгч: Хэрэглэгч): void {
  console.log(хэрэглэгч.нэр);
}

function хэрэглэгч шинэчлэх(хэрэглэгч: Хэрэглэгч): void {
  // ...
}

Хэрэглэгч нэрийг өөрчлөхөд нэг газар засаж бүх хэрэглэгдэх газар шинэчлэгдэнэ. Энэ нь томоохон кодонд маш чухал давуу тал.

Энгийн төрлүүдийг нэрлэх

Type alias зөвхөн объектод хэрэглэгддэггүй. Ямар ч төрлийг нэрлэж болно:

typescript
type Нас = number;
type Нэр = string;
type ИдэвхтэйЭсэх = boolean;

const хэрэглэгчийн нас: Нас = 25;
const хэрэглэгчийн нэр: Нэр = "Болд";
const нэвтэрсэн: ИдэвхтэйЭсэх = true;

Энэ нь кодын утгыг тодорхой болгодог. number харахад яг юуг илэрхийлж байгаа нь тодорхойгүй, харин Нас харахад шууд ойлгогдоно.

Union-г нэрлэх

Өмнөх хичээлийн union төрлийг alias-аар нэрлэвэл кодын уншигдах байдал сайжрана:

typescript
type Байрлал = "зүүн" | "баруун" | "дээш" | "доош";
type Хариу = "тийм" | "үгүй" | "магадгүй";
type Оролт = string | number | boolean;

function шилжих(чиглэл: Байрлал): void {
  console.log(`${чиглэл} тийш шилжиж байна`);
}

шилжих("зүүн"); // зөв
шилжих("хойш"); // Алдаа! Байрлал-д "хойш" байхгүй

Байрлал нэр нь функцийн параметрийн утгыг тэр дор нь тайлбарлаж байна — коммент бичихгүйгээр.

Объект дотор объект

Type alias-г давхарлан хэрэглэж болно:

typescript
type Хаяг = {
  гудамж: string;
  дүүрэг: string;
  хот: string;
};

type Хэрэглэгч = {
  нэр: string;
  нас: number;
  хаяг: Хаяг; // Хаяг alias-г дотор нь ашиглана
};

const хэрэглэгч: Хэрэглэгч = {
  нэр: "Мөнхбат",
  нас: 32,
  хаяг: {
    гудамж: "Энхтайвны өргөн чөлөө 5",
    дүүрэг: "Хан-Уул",
    хот: "Улаанбаатар",
  },
};

console.log(хэрэглэгч.хаяг.хот); // "Улаанбаатар"

Хаяг-г тусад нь тодорхойлсноор өөр газарт (жишээ нь Дэлгүүр, Оффис) дахин ашиглаж болно.

Функцийн төрлийг нэрлэх

Функцийн гарын үсгийг ч alias болгож болно:

typescript
type Тооцоологч = (а: number, б: number) => number;

const нэмэх: Тооцоологч = (а, б) => а + б;
const хасах: Тооцоологч = (а, б) => а - б;
const үржүүлэх: Тооцоологч = (а, б) => а * б;

console.log(нэмэх(10, 5)); // 15
console.log(хасах(10, 5)); // 5
console.log(үржүүлэх(10, 5)); // 50

Тооцоологч нэр нь гурван функц нэг адил гарын үсэгтэй гэдгийг харуулж байна.

Generic-тэй type alias

Generic ашигласнаар дахин ашиглагдах ерөнхий alias үүсгэж болно. Generic-г дараагийн хичээлүүдэд дэлгэрэнгүй судална — одоохондоо энгийн жишээ харцгааё:

typescript
type Хариу<Т> = {
  өгөгдөл: Т;
  амжилттай: boolean;
  алдаа: string | null;
};

type ХэрэглэгчийнХариу = Хариу<Хэрэглэгч>;
type ТоонХариу = Хариу<number>;

const хариу: ХэрэглэгчийнХариу = {
  өгөгдөл: { нэр: "Болд", нас: 25, и_мэйл: "bold@example.com" },
  амжилттай: true,
  алдаа: null,
};

<Т> бол "placeholder" — ямар ч төрлийг оруулж болно. API хариуг хадгалахад энэ хэв маяг маш өргөн хэрэглэгддэг.

Type Alias ба Interface-ийн ялгаа

Type alias-тай адил зорилготой interface гэж бас байдаг. Нарийн ялгааг 12-р хичээлд судална — одоохондоо дараах ерөнхий дүрмийг санаарай:

| Хэрэглэх тохиолдол | Зөвлөмж | | ------------------------------------- | ---------- | | Объектын бүтэц тодорхойлох | Interface | | Union, intersection, primitive нэрлэх | Type alias | | Функцийн гарын үсэг нэрлэх | Type alias | | Generic-тэй ерөнхий хэв маяг | Type alias |

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

TypeScript-ийн объект бүтцийг тодорхойлох хамгийн нийтлэг хэрэгсэл болох Interface-г дэлгэрэнгүй судална. Type alias-тай ямар ялгаатай, хэзээ аль нэгийг нь сонгох вэ?