loading...

re: Aha! Understanding Typescript's Type Predicates VIEW POST

TOP OF THREAD FULL DISCUSSION
re: Thanks for the type predicate explanation. But in my case TS (v.3.8.3) is not happy with isCat function: function isCat(animal: Cat | Dog): anima...
 

All right, I found that TS has discriminated unions for such cases.
Just extend your interfaces with a common property and use it to narrow types in your code.

interface Cat {
  kind: 'cat';
  numberOfLives: number;
}
interface Dog {
  kind: 'dog';
  isAGoodBoy: boolean;
}

function isCat(animal: Cat | Dog): animal is Cat {
  return animal.kind === 'cat';
}

function getAnimal(): Cat | Dog {
  return {
    kind: 'cat',
    numberOfLives: 7
  }
}

let animal = getAnimal();
animal.numberOfLives // Error. Property 'numberOfLives' does not exist on type 'Cat | Dog'

if (isCat(animal)) {
  animal.numberOfLives // OK
}

code of conduct - report abuse