Mypy plugin for static type checking of TypedDict keys
inspired by TypeScript's keyof type operator.
python>=3.11mypy>=1.0.1
pip install keyof
Add keyof.mypy_plugin to the list of plugins in your mypy config file
(for example pyproject.toml)
[tool.mypy] plugins = ["keyof.mypy_plugin"]
-
✅
KeyOf,RequiredKeyOf, andNotRequiredKeyOftypes -
✅ Supports inheritance
-
✅ Plays nicely with other types, e.g.
KeyOf[Foo] | Literal["bar"] -
✅ Compatibility module for
PylanceandPyright -
✅ Zero dependencies
-
❌ Generic
TypeVararguments
from typing import TypedDict from keyof import KeyOf class Data(TypedDict): version: int command: str def get_data(data: Data, key: KeyOf[Data]) -> int | str: return data[key] data = Data(version=1, command="foo") get_data(data, "version") # OK get_data(data, "foo") # mypy catches the error: # error: Argument 2 to "get_data" has incompatible type "Literal['foo']"; expected "Literal['version', 'command']"
Since Pylance and Pyright don't support plugins
and cannot correctly handle subclassing of Any (new in Python 3.11) there is compatibility module keyof.compat that exports the same types but they are only TypeAlias for Any.