# Narrowing for `match` statements ## Single `match` pattern ```py def _(flag: bool): x = None if flag else 1 reveal_type(x) # revealed: None | Literal[1] y = 0 match x: case None: y = x reveal_type(y) # revealed: Literal[0] | None ``` ## Class patterns ```py def get_object() -> object: ... class A: ... class B: ... x = get_object() reveal_type(x) # revealed: object match x: case A(): reveal_type(x) # revealed: A case B(): # TODO could be `B & ~A` reveal_type(x) # revealed: B reveal_type(x) # revealed: object ``` ## Class pattern with guard ```py def get_object() -> object: ... class A: def y() -> int: ... class B: ... x = get_object() reveal_type(x) # revealed: object match x: case A() if reveal_type(x): # revealed: A pass case B() if reveal_type(x): # revealed: B pass reveal_type(x) # revealed: object ```