Contravariant typing.Type?

Hi all, first time posting here.

I’m currently trying to enforce typing checks such that I can only pass the “choices” parameter in the following snippet of code if the “type_” parameter is one of “int”, “str” or “float”. Unfortunately, when I pass “bool” typing checks succeed as -from what I’ve been able to gather- “typing.Type” is covariant, and since “bool” subclasses “int”, it is then interpreted as such.

T = TypeVar("T", int, str, float)


class Choice(Generic[T]):
    value: T
    def __init__(self, name: str, value: T) -> None: ...
    def _to_dict(self) -> Dict[str, Any]: ...


class Parameter:
    @overload
    def __init__(
        self,
        type_: Type[bool],
        name: str,
        description: str,
        required: bool = True,
    ) -> None: ...

    @overload
    def __init__(
        self,
        type_: Type[T],
        name: str,
        description: str,
        required: bool = True,
        choices: Optional[List[Choice[T]]] = None,
    ) -> None: ...

    def __init__(
        self,
        type_: Union[Type[bool], Type[T]],
        name: str,
        description: str,
        required: bool = True,
        choices=None,
    ) -> None: ...

Here’s an example that’s passing typechecks when I wouldn’t want it to:

Parameter(
    type_=bool,
    name="everyone",
    description='Whether to mention everyone',
    choices=[]
)

I’ve been searching for hours, but I’ve been struggling to find any solution or workaround for this specific issue. Would anyone here happen to know how I could possibly fix this?