I hope it's not considered rude to "necro" a mailing list thread like this. But I can think of two big use cases that are very common in legacy code, including parts of the Python standard library. (Example 1) Supporting the full schema of logging.config.dictConfig. See: https://github.com/python/typeshed/blob/0259068/stdlib/logging/config.pyi#L2... (Example 2) Passing around kwargs. Adapted from https://github.com/python/typeshed/blob/0259068/stdlib/logging/__init__.pyi#... ``` class LoggerAdapter(Generic[_L]): logger: _L def process(self, msg: Any, kwargs: MutableMapping[str, Any]) -> tuple[Any, MutableMapping[str, Any]]: ... ``` Imagine if instead we could have this: ``` _LoggerKwargs(TypedDict, open=True): exc_info: bool stack_info: bool extra: dict[str, Any] class LoggerAdapter(Generic[_A, _B, _L]): logger: _L def process(self, msg: _A, kwargs: _LoggerKwargs) -> tuple[_B, _LoggerKwargs]: ... ``` If "open" TypedDicts are considered immutable, then this has the added benefit of discouraging mutation of the kwargs dict, which has always been a weird thing to do in my opinion, and is now generally unnecessary now that we have & and | for dicts.