Javascript 流量函数的逆变型参数?
我有两种(实际上更多)类型,基本上是basetype和(实际上是多个)扩展类型。我拥有的一个函数只对基本类型参数进行操作——它只读取对象,不更新对象。但是,它应该接受任何形式的子类型,并且没有问题 所以函数应该是反变的(如果我错了,请纠正我,我会很遗憾地把它们混在一起),我相信,如果说变量是只读的,它应该工作正常吗Javascript 流量函数的逆变型参数?,javascript,flowtype,contravariance,Javascript,Flowtype,Contravariance,我有两种(实际上更多)类型,基本上是basetype和(实际上是多个)扩展类型。我拥有的一个函数只对基本类型参数进行操作——它只读取对象,不更新对象。但是,它应该接受任何形式的子类型,并且没有问题 所以函数应该是反变的(如果我错了,请纠正我,我会很遗憾地把它们混在一起),我相信,如果说变量是只读的,它应该工作正常吗 type baseTy = {| id: number; |} type extendedTy = {| ...baseTy, extra: string,
type baseTy = {|
id: number;
|}
type extendedTy = {|
...baseTy,
extra: string,
|}
const dat: extendedTy = {
id: 1,
extra: 'test',
}
function getDoubleId(dat: $ReadOnly<baseTy>) {
return dat.id * 2;
}
function doIt() {
getDoubleId(dat);
}
这对我来说似乎很奇怪:通过声明变量为readonly,它应该接受来自基类型的任何“子级”,对吗
我已尝试添加
$Shape
-以“删除”基类型周围的精确标记,但有相同的错误….是否尝试从基类型中删除精确注释?我认为没有必要有两个精确的注释并相互扩展。一个确切的类型就足够了。同意,flow
希望将确切的(不允许其他成员)baseTy
传递到getDoubleId
,因此删除确切的类型是一个很好的选择solution@Alex,是的,但如何“删除精确”(手动操作除外)-由于其他原因,我无法修改baseTy
定义,因此,我必须基于baseTy
-基本上是“不精确的baseTy”-我认为Shape
会这样做吗?@paul23我会用另一种方法:将baseTy
定义为不精确:baseTy={id:number,…}
,并在必须精确的地方使用。
Cannot call `getDoubleId` with `dat` bound to `dat` because property `extra` is missing in `baseTy` [1] but exists in `extendedTy` [2]. [prop-missing]