diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 172d44555b94..26ba319d7aa5 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -1940,6 +1940,11 @@ def analyze_type_type_callee(self, item: ProperType, context: Context) -> Type: """ if isinstance(item, AnyType): return AnyType(TypeOfAny.from_another_any, source_any=item) + if isinstance(item, NoneType): + # `type(None)` / `type[None]` is instantiable at runtime and returns None. + return CallableType( + [], [], [], NoneType(), self.named_type("builtins.function"), from_type_type=True + ) if isinstance(item, Instance): res = type_object_type(item.type) if isinstance(res, CallableType): diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index 2cd43c74ebb5..a52dc0c88208 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -3913,6 +3913,22 @@ def foo(arg: Type[Tuple[int]]): arg() # E: Cannot instantiate type "type[tuple[int]]" [builtins fixtures/tuple.pyi] +[case testTypeCanInstantiateNoneType] +from types import NoneType + +type(None)() +NoneType() + +def f(n: type[None]) -> None: + n() + +def g(n: type[NoneType]) -> None: # E: NoneType should not be used as a type, please use None instead + n() + +f(NoneType) +g(NoneType) +[builtins fixtures/tuple.pyi] + [case testTypeUsingTypeCOverloadedClass] from foo import * [file foo.pyi]