Optionalを返す関数に対して、Pyright(Pylance)、mypyではNone出ないことが評価されないと、返されたオブジェクトのプロパティにアクセスしてもエラーとなってしまいます。
これに対して、assert val is not None
でチェックすればOKというのがシンプルに良さそうと思いました。
# Optional[Way] を返す関数
way1 = repo.get_way(100)
# way1 が None である可能性があるため、mypy、pyrightでエラーになる
print(f"way: {way1.way_id}")
# None で分岐を作るのが正攻法
way2 = repo.get_way(100)
if way2 is not None:
print(f"way: {way1.way_id}")
# typing.cast や # type: ignore を使うと回避できるが
# 代入したもとの値がWay型であるかの評価がされなくなってしまう
way3: Way = repo.get_way(100) # type: ignore
print(f"way: {way3.way_id}")
way4 = typing.cast(Way, repo.get_way(100))
print(f"way: {way4.way_id}")
# assert 使えば分岐なしにNoneでないことが評価でき、Pyrightでもエラーにならない
way5 = repo.get_way(100)
assert way5 is not None
print(f"way: {way5.way_id}")