I was very excited to try out mypy 2.2 with the initial support for the TypedDict closed keyword.
But in our code base, where we often iterate over TypedDicts, it did not help much because the keys and values are still inferred as str and object, respectively.
from typing_extensions import TypedDict, reveal_type
class Closed(TypedDict, closed=True, total=False):
a: int
b: str
c = Closed(a=1, b='a')
reveal_type(c.items())
for key, val in c.items():
c[key]
$ mypy --pretty test.py
test.py:9: note: Revealed type is "_collections_abc.dict_items[str, object]"
test.py:12: error: TypedDict key must be a string literal; expected one of ("a", "b") [literal-required]
c[key]
^~~
Found 1 error in 1 file (checked 1 source file)
ty narrows both keys and values here
$ ty check test.py
ty check test.py
info[revealed-type]: Revealed type
--> test.py:9:13
|
9 | reveal_type(c.items())
| ^^^^^^^^^^ `dict_items[Literal["a", "b"], int | str]`
|
Found 1 diagnostic
I was very excited to try out mypy 2.2 with the initial support for the TypedDict closed keyword.
But in our code base, where we often iterate over TypedDicts, it did not help much because the keys and values are still inferred as
strandobject, respectively.tynarrows both keys and values here