你能在一些简单的TypeScript例子中解释一下什么是方差、协方差、逆方差和协方差吗?
发布于 2021-03-01 00:49:27
方差
与泛型类型
变化
关于其类型参数
..。如果你知道这一点
,那么方差就会告诉你是否可以得出这样的结论
,结论是
,或者都不是,或者两者都是。
协方差
意味着
和
co
-
变化
..。也就是说,
随
(方向与相同)
..。换句话说,如果
,然后
..。示例:
函数或方法类型与它们的返回类型是不同的:
键入Co = () => V;函数协方差(t: T,u: U,coT: Co,coU: Co) {u= t;// okay t= u;//错误!coU = coT;// okay = coU;//错误!}
其他(目前未说明)示例如下:
对象的属性类型是协变的,即使这对于可变属性来说并不合理。
类构造函数的实例类型是协变的
逆方差
意味着
和
反差
-
变化
..。也就是说,
变化与
(与相反方向)
..。换句话说,如果
,然后
..。示例:
函数类型与其参数类型相反(使用
已启用):
键入Contra = (v: V) => void;函数contraU(t: T,u: U,contraT: Contra,contraU: Contra) {u= t;// okay t= u;//错误!contraU = contraT;//错误!contraT = contraU;//好的}
其他(目前未说明)示例如下:
对象的键类型是逆变量的
类构造函数的构造参数类型是逆变量
不变性
意味着
既不与之相异,也不与之相反
:
既不是协变的,也不是逆变的
..。这实际上是在最一般的情况下发生的。协方差和逆方差是“脆弱的”,因为当您组合协变和逆变类型的函数时,很容易产生不变的结果。示例:
返回与其参数相同类型的函数类型在该类型中既不是协变的,也不是逆变的:
键入= (v: V) => V;函数不变性(t: T,u: U,inT: In,inU: In) {u= t;// okay t= u;//错误!inU = inT;//错误!inT = inU;//错误!}
双方差
意味着
变化
两者都有
使用
和
反对
:
中既是协变的也是逆变的
..。在声音类型系统中,这基本上
从来没有发生过
对于任何非平凡类型的函数。您可以演示只有像这样的常量类型的功能
是真正的双变量(快速草图:
对所有人来说都是正确的
,所以
和
,并且在声音类型系统中,如果
和
,然后
与
..。所以如果
=
为所有人
,然后
是常量)。
但是Typescript没有
它也不打算
一个完善的类型系统。而且还有
一个值得注意的案例
其中TypeScript将类型函数视为双变量:
方法类型随其参数类型的不同而变化(这也发生在所有函数类型中,使用
已禁用):
类型Bi ={ foo(v: V):biU };函数协方差(t: T,u: U,biT: Bi,foo: Bi) {u= t;// okay t= u;//错误!biU = biT;// okay = biU;// okay }
游乐场代码链接
https://stackoverflow.com/questions/66410115
复制相似问题