Mypy plugin for static type checking of TypedDict keys
inspired by TypeScript's keyof type operator.
python>=3.11mypy>=1.0.1
pip install keyofAdd 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.