github astral-sh/ty 0.0.22

10 hours ago

Release Notes

Released on 2026-03-12.

Bug fixes

  • Fix issue where variables could be inferred as Divergent if they were assigned using tuple unpacking in loops (#23812)
  • Allow error = "all" in a root pyproject.toml file to be overridden using tool.ty.overrides in a subdirectory's pyproject.toml file (#23712)
  • Only unsoundly upcast type[] types to their constructor Callable type during assignability checks, not during redundancy/subtyping checks (#23834, #23901)
  • Fix stack overflow that could occur with certain recursive protocols (#23870)

LSP server

  • Improve syntax highlighting by fixing semantic token classification for generic class members in annotations (#23811)

CLI

  • Add ty explain <RULE> CLI command (#23766)

Core type checking

  • Add validation for type parameters with defaults after TypeVarTuple parameters (#23807)
  • Allow subtypes of LiteralString to be narrowed using equality checks (#23794)
  • Detect invalid partially stringified PEP-604 unions (#23285)
  • Disambiguate duplicate-looking overloaded callables in union display (#23907)
  • Don't promote module-literal types to types.ModuleType (#23786)
  • Improve type context support for __setitem__ dunder calls (#23800)
  • Infer t | {"foo": int} as TD if t is an instance of a TypedDict td with a foo: int key (#23806)
  • Narrow T to T & str rather than str if T is a constrained TypeVar with str as one of its constraints (#23850)
  • Promote None to None | Unknown in invariant contexts (#23790)
  • Reject type[Callable] in type annotations (#23753)
  • Support enum member access through enum instances and members (#23772)
  • Eagerly narrow the type associated with keys of heterogeneous dict literals even when a dict literal appears as a subexpression inside a list or tuple literals (#23569)
  • Ensure that T & ~S is always inferred as a subtype of U during generic inference if T is understood as a subtype of U (#23728)
  • Optimize and improve cycle recovery by preventing "tainted" unions in cycle normalization (#23563)

Installer

  • Prefer downloading releases from Astral's mirror over GitHub (#2980)

Contributors

Install ty 0.0.22

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ty/releases/download/0.0.22/ty-installer.sh | sh

Install prebuilt binaries via powershell script

powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ty/releases/download/0.0.22/ty-installer.ps1 | iex"

Download ty 0.0.22

File Platform Checksum
ty-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ty-x86_64-apple-darwin.tar.gz Intel macOS checksum
ty-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ty-i686-pc-windows-msvc.zip x86 Windows checksum
ty-x86_64-pc-windows-msvc.zip x64 Windows checksum
ty-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ty-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ty-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ty-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ty-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ty-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ty-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ty-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ty-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ty-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ty-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ty-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

Don't miss a new ty release

NewReleases is sending notifications on new releases.