Skip to content

Commit

Permalink
Fix typing.TypeAliasType being undefined on python < 3.12 (#17558)
Browse files Browse the repository at this point in the history
Closes #17554
CC @JukkaL 
Refs #17320
  • Loading branch information
sobolevn authored and hauntsaninja committed Jul 27, 2024
1 parent 6cf9180 commit cb44e4d
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
10 changes: 8 additions & 2 deletions mypy/checkexpr.py
Original file line number Diff line number Diff line change
Expand Up @@ -4682,7 +4682,7 @@ def visit_type_application(self, tapp: TypeApplication) -> Type:
"""
if isinstance(tapp.expr, RefExpr) and isinstance(tapp.expr.node, TypeAlias):
if tapp.expr.node.python_3_12_type_alias:
return self.named_type("typing.TypeAliasType")
return self.type_alias_type_type()
# Subscription of a (generic) alias in runtime context, expand the alias.
item = instantiate_type_alias(
tapp.expr.node,
Expand Down Expand Up @@ -4746,7 +4746,7 @@ class LongName(Generic[T]): ...
y = cast(A, ...)
"""
if alias.python_3_12_type_alias:
return self.named_type("typing.TypeAliasType")
return self.type_alias_type_type()
if isinstance(alias.target, Instance) and alias.target.invalid: # type: ignore[misc]
# An invalid alias, error already has been reported
return AnyType(TypeOfAny.from_error)
Expand Down Expand Up @@ -5862,6 +5862,12 @@ def named_type(self, name: str) -> Instance:
"""
return self.chk.named_type(name)

def type_alias_type_type(self) -> Instance:
"""Returns a `typing.TypeAliasType` or `typing_extensions.TypeAliasType`."""
if self.chk.options.python_version >= (3, 12):
return self.named_type("typing.TypeAliasType")
return self.named_type("typing_extensions.TypeAliasType")

def is_valid_var_arg(self, typ: Type) -> bool:
"""Is a type valid as a *args argument?"""
typ = get_proper_type(typ)
Expand Down
11 changes: 10 additions & 1 deletion test-data/unit/check-type-aliases.test
Original file line number Diff line number Diff line change
Expand Up @@ -1074,7 +1074,7 @@ x: TestType = 42
y: TestType = 'a'
z: TestType = object() # E: Incompatible types in assignment (expression has type "object", variable has type "Union[int, str]")

reveal_type(TestType) # N: Revealed type is "typing.TypeAliasType"
reveal_type(TestType) # N: Revealed type is "typing_extensions.TypeAliasType"
TestType() # E: "TypeAliasType" not callable

class A:
Expand All @@ -1084,6 +1084,15 @@ yc: A.ClassAlias = "" # E: Incompatible types in assignment (expression has typ
[builtins fixtures/tuple.pyi]
[typing fixtures/typing-full.pyi]

[case testTypeAliasTypePython311]
# flags: --python-version 3.11
# Pinning to 3.11, because 3.12 has `TypeAliasType`
from typing_extensions import TypeAliasType

TestType = TypeAliasType("TestType", int)
x: TestType = 1
[builtins fixtures/tuple.pyi]

[case testTypeAliasTypeInvalid]
from typing_extensions import TypeAliasType

Expand Down

0 comments on commit cb44e4d

Please sign in to comment.