@@ -2463,3 +2463,60 @@ def test(x: T) -> T:
24632463 reveal_type(x.x) # N: Revealed type is "builtins.str"
24642464 return x
24652465[builtins fixtures/isinstance.pyi]
2466+
2467+ [case testIsinstanceNarrowingWithSelfTypes]
2468+ from typing import Generic, TypeVar, overload
2469+
2470+ T = TypeVar("T")
2471+
2472+ class A(Generic[T]):
2473+ def __init__(self: A[int]) -> None:
2474+ pass
2475+
2476+ def check_a(obj: "A[T] | str") -> None:
2477+ reveal_type(obj) # N: Revealed type is "Union[__main__.A[T`-1], builtins.str]"
2478+ if isinstance(obj, A):
2479+ reveal_type(obj) # N: Revealed type is "__main__.A[T`-1]"
2480+ else:
2481+ reveal_type(obj) # N: Revealed type is "builtins.str"
2482+
2483+
2484+ class B(Generic[T]):
2485+ @overload
2486+ def __init__(self, x: T) -> None: ...
2487+ @overload
2488+ def __init__(self: B[int]) -> None: ...
2489+ def __init__(self, x: "T | None" = None) -> None:
2490+ pass
2491+
2492+ def check_b(obj: "B[T] | str") -> None:
2493+ reveal_type(obj) # N: Revealed type is "Union[__main__.B[T`-1], builtins.str]"
2494+ if isinstance(obj, B):
2495+ reveal_type(obj) # N: Revealed type is "__main__.B[T`-1]"
2496+ else:
2497+ reveal_type(obj) # N: Revealed type is "builtins.str"
2498+
2499+
2500+ class C(Generic[T]):
2501+ @overload
2502+ def __init__(self: C[int]) -> None: ...
2503+ @overload
2504+ def __init__(self, x: T) -> None: ...
2505+ def __init__(self, x: "T | None" = None) -> None:
2506+ pass
2507+
2508+ def check_c(obj: "C[T] | str") -> None:
2509+ reveal_type(obj) # N: Revealed type is "Union[__main__.C[T`-1], builtins.str]"
2510+ if isinstance(obj, C):
2511+ reveal_type(obj) # N: Revealed type is "__main__.C[T`-1]"
2512+ else:
2513+ reveal_type(obj) # N: Revealed type is "builtins.str"
2514+
2515+
2516+ class D(tuple[T], Generic[T]): ...
2517+
2518+ def check_d(arg: D[T]) -> None:
2519+ if not isinstance(arg, D):
2520+ return
2521+ reveal_type(arg) # N: Revealed type is "tuple[T`-1, fallback=__main__.D[Any]]"
2522+ [builtins fixtures/tuple.pyi]
0 commit comments