Javascript 流量函数的逆变型参数?

Javascript 流量函数的逆变型参数?,javascript,flowtype,contravariance,Javascript,Flowtype,Contravariance,我有两种(实际上更多)类型,基本上是basetype和(实际上是多个)扩展类型。我拥有的一个函数只对基本类型参数进行操作——它只读取对象,不更新对象。但是,它应该接受任何形式的子类型,并且没有问题 所以函数应该是反变的(如果我错了,请纠正我,我会很遗憾地把它们混在一起),我相信,如果说变量是只读的,它应该工作正常吗 type baseTy = {| id: number; |} type extendedTy = {| ...baseTy, extra: string,

我有两种(实际上更多)类型,基本上是basetype和(实际上是多个)扩展类型。我拥有的一个函数只对基本类型参数进行操作——它只读取对象,不更新对象。但是,它应该接受任何形式的子类型,并且没有问题

所以函数应该是反变的(如果我错了,请纠正我,我会很遗憾地把它们混在一起),我相信,如果说变量是只读的,它应该工作正常吗

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]