Sobes.tech
Middle

Оё ягон вақт истифода бурдани унионҳои дискриминантӣ ва type guards? Кадом type guards-и дарунсохтро медонед?

sobes.tech AI

Ҷавоб аз AI

Дискриминативи юниони (discriminated unions) ва тип гардҳо (type guards) воситаҳои қавии TypeScript барои кор бо юнионҳои типҳо мебошанд, ки имкон медиҳанд, ки ба таври бехатартар муайян кардани типи махсус дар дохили юнион.

Дискриминативи юниони — ин юнионҳои типҳо мебошанд, ки ҳар як тип дорои калиди литералӣ умумӣ (масалан, майдони type), ки тавассути он метавон ба таври ягона муайян кард, ки кадом тип аст.

Гардҳои тип — функсияҳо ё сохторҳое мебошанд, ки дар вақти иҷрои барнома, типи тағйирёбандаро санҷида, онро барои компилятор маҳдуд мекунанд.

Гардҳои дохилӣ дар TypeScript:

  • typeof — барои типҳои primitives (string, number, boolean)
  • instanceof — барои санҷиши аъзоият ба класа
  • in — барои санҷиши мавҷудияти хосият дар объект

Масалан, як юнион дискриминатсияшуда ва гард барои тип:

interface Чоркунҷа {
  kind: 'square';
  size: number;
}

interface Давра {
  kind: 'circle';
  radius: number;
}

type Шакл = Чоркунҷа | Давра;

function майдони(шакл: Шакл): number {
  switch (шакл.kind) {
    case 'square':
      return шакл.size * шакл.size;
    case 'circle':
      return Math.PI * шакл.radius ** 2;
  }
}

Ин ҷо, kind — дискриминатор, ва switch — ҳамчун гард барои тип амал мекунад.

Истифодаи гардҳои дохилии тип:

function астString(қимат: unknown): қимат is string {
  return typeof қимат === 'string';
}

if (астString(нечто)) {
  // дар ин ҷо, `нечто` — типи string
}