问题描述
$ cat foo.py
from typing import overload,Union,TypeVar
T = Union[int,str]
SubT = TypeVar("SubT",int,str)
@overload
def a(t: T) -> T:
...
@overload
def a(t: SubT) -> SubT:
...
def a(t: T) -> T:
return t
$ mypy foo.py
foo.py:7: error: Overloaded function signatures 1 and 2 overlap with incompatible return types
为什么返回类型不兼容,如何进行类型检查?我想要这些示例返回类型:
v_1: Union[int,str] = 1
v_2: int = 2
v_3: str = "3"
a(v_1) # Want Union[int,str].
a(v_2) # Want int.
a(v_3) # Want str.
我想避免为a
和int
显式重载str
,因为实际上SubT
有2个以上的约束。
如果删除第一个重载,a(v_1)
将不会输入check。如果删除第二个重载,则a(v_2)
和a(v_3)
的返回值类型将分别提示为Union[int,str]
而不是int
和str
。
在我的实际问题中,我有一个Iterable
是SubT
下的同质类型(TypeVar
)还是T
下是同质类型(Union
)。我想写一个a
,它可以对两个元素都进行操作,并且如果在同类情况下也不会丢失粒度。
解决方法
:host ::ng-deep .mat-tab-header {
position: fixed;
}
将让您同时提供联合类型和联合本身作为选择:
TypeVar