<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/the-mypy-blog-mypy-2-2-released-ll27m3phi" -->

---
title: The Mypy Blog: Mypy 2.2 Released | daily.dev
description: Mypy 2.2.0 has shipped with support for closed TypedDicts (PEP 728), complete type variable defaults (PEP 696), respect for explicit __new__() return type...
canonical: https://daily.dev/posts/the-mypy-blog-mypy-2-2-released-ll27m3phi
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: The Mypy Blog: Mypy 2.2 Released | daily.dev
og:description: Mypy 2.2.0 has shipped with support for closed TypedDicts (PEP 728), complete type variable defaults (PEP 696), respect for explicit __new__() return type...
og:url: https://daily.dev/posts/the-mypy-blog-mypy-2-2-released-ll27m3phi
og:image: https://api.daily.dev/og/posts/lL27m3phi.png
og:image:alt: The Mypy Blog: Mypy 2.2 Released
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# The Mypy Blog: Mypy 2.2 Released

**[mypy - Optional Static Typing for Python](https://daily.dev/sources/mypy-lang)** · 8 min read · 0 upvotes · 0 comments

## Summary

Mypy 2.2.0 has shipped with support for closed TypedDicts (PEP 728), complete type variable defaults (PEP 696), respect for explicit __new__() return type annotations, non-experimental TypeForm support, and an experimental WASM wheel for Python 3.14. The release also includes numerous mypyc free-threading fixes, performance improvements, crash fixes, and native parser enhancements. Install via pip install -U mypy.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://mypy-lang.blogspot.com/2026/07/mypy-22-released.html>

## Questions this post answers

### What does the closed=True keyword do for TypedDict in mypy 2.2?

It implements PEP 728 closed TypedDicts, which cannot have extra keys beyond those explicitly defined. This lets mypy safely narrow unions of TypedDicts using 'in' checks, since it knows exactly which keys are present. A closed TypedDict is assignable to an open TypedDict with the same keys, but not the reverse. It is available in mypy 2.2.0 via TypedDict(..., closed=True) or class-based syntax with closed=True.

_Developers adopting stricter TypedDict schemas can follow mypy release changes on daily.dev._

### Does mypy respect an explicit return type annotation on __new__()?

Yes, as of mypy 2.2.0. Previously mypy always assumed __new__() returned an instance of the current class, ignoring explicit annotations; now if you annotate a different return type, mypy uses it, as long as it's a subtype of the current class (or Any, or inherited from a superclass as a valid supertype). This fixes several long-standing bugs where explicit __new__() return types were ignored.

_Track type-checker behavior changes like this one on daily.dev before upgrading mypy._

### Is TypeForm still experimental in mypy?

No, TypeForm support is no longer experimental as of mypy 2.2.0. TypeForm, introduced in Python 3.14, lets you annotate parameters that accept type expressions for better type checking of functions working with types as values. It had previously been reverted from mypy 2.1 due to a performance regression, which has now been mitigated.

_Follow python typing feature maturity updates like this on daily.dev when planning upgrades._

## Similar posts on daily.dev

- [The Mypy Blog: Mypy 2.4 Released](https://daily.dev/posts/the-mypy-blog-mypy-2-4-released-frfrx4bzr) · mypy - Optional Static Typing for Python · 1 upvotes · 0 comments
- [PyPy v8.0.1 release](https://daily.dev/posts/pypy-v8-0-1-release-dkldotvng) · Planet Python · 0 upvotes · 0 comments
- [What’s up Python? Wheels in the browser, astral still moves fast, and my new favorite @](https://daily.dev/posts/what-s-up-python-wheels-in-the-browser-astral-still-moves-fast-and-my-new-favorite--9ok4xip7c) · Bite Code · 4 upvotes · 0 comments
- [The Joy of Typing](https://daily.dev/posts/the-joy-of-typing-r5aiqx2dz) · Towards Data Science · 0 upvotes · 0 comments

---

Tags: [#python](https://daily.dev/tags/python), [#webassembly](https://daily.dev/tags/webassembly)

[View this post on daily.dev](https://daily.dev/posts/the-mypy-blog-mypy-2-2-released-ll27m3phi)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"The Mypy Blog: Mypy 2.2 Released","url":"https://daily.dev/posts/the-mypy-blog-mypy-2-2-released-ll27m3phi","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/the-mypy-blog-mypy-2-2-released-ll27m3phi"},"datePublished":"2026-08-23T12:17:26.499Z","dateModified":"2026-08-23T12:24:27.523Z","description":"Mypy 2.2.0 has shipped with support for closed TypedDicts (PEP 728), complete type variable defaults (PEP 696), respect for explicit __new__() return type...","image":"https://media.daily.dev/image/upload/s--HRgLpUt6--/f_auto/v1722860399/public/Placeholder%2003","thumbnailUrl":"https://media.daily.dev/image/upload/s--HRgLpUt6--/f_auto/v1722860399/public/Placeholder%2003","isAccessibleForFree":true,"articleSection":"mypy - Optional Static Typing for Python","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"mypy - Optional Static Typing for Python","logo":"https://media.daily.dev/image/upload/logos/placeholder.jpg","url":"https://daily.dev/sources/mypy-lang"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/the-mypy-blog-mypy-2-2-released-ll27m3phi","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"python,webassembly","timeRequired":"PT8M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"mypy - Optional Static Typing for Python","item":"https://daily.dev/sources/mypy-lang"},{"@type":"ListItem","position":3,"name":"The Mypy Blog: Mypy 2.2 Released"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/the-mypy-blog-mypy-2-2-released-ll27m3phi#faq","mainEntity":[{"@type":"Question","name":"What does the closed=True keyword do for TypedDict in mypy 2.2?","acceptedAnswer":{"@type":"Answer","text":"It implements PEP 728 closed TypedDicts, which cannot have extra keys beyond those explicitly defined. This lets mypy safely narrow unions of TypedDicts using 'in' checks, since it knows exactly which keys are present. A closed TypedDict is assignable to an open TypedDict with the same keys, but not the reverse. It is available in mypy 2.2.0 via TypedDict(..., closed=True) or class-based syntax with closed=True. Developers adopting stricter TypedDict schemas can follow mypy release changes on daily.dev."}},{"@type":"Question","name":"Does mypy respect an explicit return type annotation on __new__()?","acceptedAnswer":{"@type":"Answer","text":"Yes, as of mypy 2.2.0. Previously mypy always assumed __new__() returned an instance of the current class, ignoring explicit annotations; now if you annotate a different return type, mypy uses it, as long as it's a subtype of the current class (or Any, or inherited from a superclass as a valid supertype). This fixes several long-standing bugs where explicit __new__() return types were ignored. Track type-checker behavior changes like this one on daily.dev before upgrading mypy."}},{"@type":"Question","name":"Is TypeForm still experimental in mypy?","acceptedAnswer":{"@type":"Answer","text":"No, TypeForm support is no longer experimental as of mypy 2.2.0. TypeForm, introduced in Python 3.14, lets you annotate parameters that accept type expressions for better type checking of functions working with types as values. It had previously been reverted from mypy 2.1 due to a performance regression, which has now been mitigated. Follow python typing feature maturity updates like this on daily.dev when planning upgrades."}}]}
```

