Property does not exist on type

Изучаю Typescript, остановился на теме сужения типов, и один момент мне стал решительно непонятен:

interface Circle {
  radius: number
}

interface Square {
  sideLength: number
}

type Shape = Circle | Square


function getArea(shape: Shape) {
    if (!(typeof shape.radius == 'undefined')) { // Property 'radius' does not exist on type 'Square'.
        return Math.PI * shape.radius ** 2       // Property 'radius' does not exist on type 'Square'.
    } else {
        return 'none';
    }
}

Я понимаю что у объекта может не оказаться этого свойства и потому я делаю проверку на undefined значение, но компилятор всё равно ругается хотя код выполняется как надо. Так вот, я хотел бы узнать почему компилятор продолжает ругаться.

Пытался использовать оператор ?? -> if (shape.radius ?? false) {}, но компилятор всё равно ворчит да и 0 в свойстве radius обрабатывается некорректно .


Ответы (1 шт):

Автор решения: Alexander Chernin

Можно как написано в "ветхом завете":

function getArea(shape: Shape) {
    if ('radius' in shape) {
      console.log(shape.radius);
    }
}

По-тээсовски:

function isCircle(s: Shape): s is Circle {
  return (<Circle>s).radius !== undefined;
}

function getArea(shape: Shape) {
    if (isCircle(shape)) {
      console.log(shape.radius);
    }
}
→ Ссылка