TypeScript Functions and Narrowing/Narrow with the `in` operator

Refine unions by checking property existence.

Section: Narrowing and Control Flow

Narrow with the `in` operator

typescript
typescript
type Dog = { bark(): void };
type Cat = { meow(): void };

function speak(animal: Dog | Cat) {
  if ("bark" in animal) animal.bark();
  else animal.meow();
}
Explanation

Property checks are especially useful for discriminating object-shape unions.

Learn the surrounding workflow

Compare similar commands or jump into common fixes when this command is part of a bigger troubleshooting path.

Related commands

Same sheet · prioritizing Narrowing and Control Flow
Narrow with `typeof`
Refine primitive unions using runtime checks.
OpenIn sheettypescriptsame section
Narrow with `instanceof`
Refine class-based unions using constructor checks.
OpenIn sheettypescriptsame section
Exhaustive switch with `never`
Catch unhandled union members.
OpenIn sheettypescriptsame section
Custom type guard with predicate
Teach TypeScript a reusable narrowing rule.
OpenIn sheettypescriptsame section
Type a function
Annotate parameters and return values.
OpenIn sheettypescript1 tag match
Type an async function
Return a typed promise from an async function.
OpenIn sheettypescript1 tag match