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 `instanceof`
Refine class-based unions using constructor checks.
Custom type guard with predicate
Teach TypeScript a reusable narrowing rule.
Type an async function
Return a typed promise from an async function.