Home > database >  Types predicate: can 'is' be seen as a subtype of boolean?
Types predicate: can 'is' be seen as a subtype of boolean?

Time:05-24

I was studying better type predicates and how they actually narrow the type through pet is Fish, for example.

I've tried to create a simple Typescript playground

In doSomething I use isFish function. isFish is represented to have a return type pet is Fish, but if I use it and assign the result to a variable, the result is kinda "casted" to a boolean. So I guess pet is Fish can be seen as a type itself.

So my question is: can pet is Fish (or whatever similar expression) be considered a subtype of boolean, just like "Hello world" is a subtype of string?

type X = "hello world" | string;
  // ^? type X = string

type Y = "hello world" & string;
  // ^? type Y = "hello world"

Thank you!

CodePudding user response:

No this is not really equivalent to const strings. Booleans have only two possible values, i.e. boolean is the same as true | false, you cannot narrow that type other than having just true or false.

I would think of type guard as being a special syntax, a function like isFish(pet: Cat | Dog | Fish): pet is Fish returns a boolean, and the compiler knows if that boolean is true that the pet variable is in fact a Fish, or if false then it is not a Fish, and narrows the type of the pet variable e.g.:

const pet: Cat | Dog | Fish = getPet();
if (isFish(pet) {
  // pet now has type Fish
} else {
  // pet now has type Cat | Dog
}
  • Related