← Wszystkie zadaniaTypeScript · Junior

Discriminated union: pole figury

Typ Shape opisuje koło i prostokąt; pole kind mówi, która to figura. Dodaj do niego kwadrat { kind: "square"; size: number } i napisz area(shape), które zwraca pole dowolnej figury.

Przyda się, żeby TypeScript przypomniał o area, gdy kiedyś dojdzie kolejna figura: dodaj sprawdzenie wyczerpania przypadków przez never.

Testy (6)

Testy typów sprawdza kompilator TypeScriptu w trybie strict. Expect<Equal<A, B>> przechodzi, gdy typy są dokładnie takie same, a // @ts-expect-error, gdy następna linia się nie kompiluje. Pierwsze uruchomienie pobiera kompilator, więc trwa kilka sekund.

  1. typy
    type _ = Expect<Equal<Shape["kind"], "circle" | "rect" | "square">>;
  2. typy
    area({ kind: "square", size: 3 });
  3. typy
    // @ts-expect-error - a circle has a radius, not a width
    area({ kind: "circle", width: 2 });
  4. expect(Math.abs(area({ kind: 'circle', radius: 2 }) - Math.PI * 4) < 1e-9).toBe(true);
  5. expect(area({ kind: 'rect', width: 3, height: 4 })).toBe(12);
  6. expect(area({ kind: 'square', size: 5 })).toBe(25);