← Усі задачіTypeScript · Junior

Discriminated union: площа фігури

Тип Shape описує коло і прямокутник; поле kind показує, яка це фігура. Додайте до нього квадрат { kind: "square"; size: number } і напишіть area(shape), що повертає площу будь-якої фігури.

Корисно, щоб TypeScript нагадав про area, якщо колись з'явиться ще одна фігура: зробіть перевірку на вичерпність через never.

Тести (6)

Тести типів перевіряє компілятор TypeScript у режимі strict. Expect<Equal<A, B>> проходить, коли типи збігаються точно, а // @ts-expect-error - коли наступний рядок не компілюється. Перший запуск завантажує компілятор, тож триває кілька секунд.

  1. типи
    type _ = Expect<Equal<Shape["kind"], "circle" | "rect" | "square">>;
  2. типи
    area({ kind: "square", size: 3 });
  3. типи
    // @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);