型変数の例

from dataclasses import dataclass
from functools import singledispatch
from typing import Dict, Generic, List, NewType, Optional, TypeVar


@dataclass
class FooEvent:
    pass


@dataclass
class BarEvent:
    pass


@dataclass
class BazEvent:
    pass


Event = TypeVar("Event", FooEvent, BarEvent, BazEvent)


@singledispatch
def as_custom_dict(ev: Event) -> Dict:
    return {}


@as_custom_dict.register
def _(ev: BazEvent) -> Dict:
    return {}


def func_effect(ev: Event) -> Dict:
    return as_custom_dict(ev)