Sobes.tech
Middle

Ar kada nors teko naudoti diskriminacines jungtis ir type guards? Kokius įmontuotus type guards žinote?

sobes.tech AI

Atsakymas iš AI

Discriminated unions (discriminated unions) ir type guards (tipų sargai) yra galingi įrankiai TypeScript, leidžiantys saugiai nustatyti konkretų tipą unijoje.

Discriminated unions yra tipų unijos, kuriose kiekvienas tipas turi bendrą literalinį raktą (pvz., lauką type), pagal kurį galima aiškiai nustatyti konkretų tipą.

Type guards yra funkcijos ar konstrukcijos, kurios tikrina kintamojo tipą vykdymo metu ir siaurina tipą kompiliatoriui.

Integruoti TypeScript tipų sargai:

  • typeof — pagrindiniams tipams (string, number, boolean)
  • instanceof — patikrinimui, ar priklauso klasei
  • in — patikrinimui, ar objekte yra tam tikras savybė

Pavyzdys diskriminacinės unijos ir tipo sargo:

interface Kvadratas {
  kind: 'square';
  size: number;
}

interface Apskritimas {
  kind: 'circle';
  radius: number;
}

type Forma = Kvadratas | Apskritimas;

function plotas(forma: Forma): number {
  switch (forma.kind) {
    case 'square':
      return forma.size * forma.size;
    case 'circle':
      return Math.PI * forma.radius ** 2;
  }
}

Čia kind yra diskriminatorius, o switch veikia kaip tipų sargas.

Naudojant integruotus tipų sargus:

function yraString(reikšmė: unknown): reikšmė is string {
  return typeof reikšmė === 'string';
}

if (yraString(kas)) {
  // čia, `kas` yra string
}