typing.NewType は、既存の型の値が特定の条件を満たしている、という状態を表現するために新しい型として定義する機能
typing.Final で変数への再代入がされていないかをチェックできる
さくっと型エイリアスを定義することもできる
Book = dict[str, int | str]
Library = dict[str, Book]
lib: Library = {}
book: Book = {"title": "たいとる", "price": 42}
lib["ほんのなまえ"] = book
API から返ってくる JSON を dict にする場合など、異種コレクションになる場合は typing.TypedDict を継承したクラスを作ってメンバーに型を付与すれば良い(定義は dataclasses.dataclass みたいだけど、プロパティでアクセスすることはできない)
ジェネリクス
def packing[T](val: T) -> list[T]:
return [val]
$ mypy --enable-incomplete-feature=NewGenericSyntax type_sample.py