Mypy plugin for static type checking of TypedDict keys
inspired by TypeScript's keyof
type operator.
python>=3.11
mypy>=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
, andNotRequiredKeyOf
types -
✅ Supports inheritance
-
✅ Plays nicely with other types, e.g.
KeyOf[Foo] | Literal["bar"]
-
✅ Compatibility module for
Pylance
andPyright
-
✅ Zero dependencies
-
❌ Generic
TypeVar
arguments
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
.