I finally made it using typing.overload:
@overload def func(a: AnyStr, *b: AnyStr) -> Tuple[Optional[AnyStr], AnyStr]: ... @overload def func(a: AnyStr, *b: AValue) -> Tuple[Optional[AValue], AnyStr]: ... @overload def func(a: AnyStr, *b: Union[AValue, AnyStr]) -> Tuple[Union[AValue, AnyStr, None], AnyStr]: ... def func(a: AnyStr, *b: Union[AValue, AnyStr]) -> Tuple[Union[AValue, AnyStr, None], AnyStr]: for _b in b: if isinstance(_b, AValue): # ..... some code convert _b into AnyStr (_tb) that match a else: _tb = _b if a.startswith(_tb): return (_b, a.removeprefix(_tb)) return (None, a)