FlowJS:类型继承

时间:2017-01-23 11:39:28

标签: inheritance intersection flowtype type-alias

我正在为我的项目测试FlowJS,我遇到Type Aliases的问题。

我为API构建了一个Web SDK:我有一个使用此方法的Helper类:

class Helper {
    find(filters:PaginationOptions = {}) {
        // ...
    }
}

PaginationOptions是一个基本的FlowJS类型:

type PaginationOptions = {
  start?:string,
  end?:number,
};

我还有一个帮助用户,继承自Helper

class UsersHelper extends Helper {
    find(filters:UsersFilterOptions = {}) {
        // ...
    }
}

UsersFilterOptions是FlowJS类型“扩展”PaginationOptions

type UsersFilterOptions = {
  username?:string,
  city?:string,
} & PaginationOptions;

我在这里使用了Intersection,因此我的用户过滤器也应该接受startend属性。

我的IDE(PHPStorm)似乎不喜欢我的班级find()中的UsersHelper方法,它一直告诉我:

  

不兼容的覆盖,应该有'PaginationOptions'类型

嗯......我知道,这就是UsersFilterOptionsPaginationOptions交叉的原因。

但FlowJS还向我展示了另外两个警告:

  

流程:属性username。在对象文字中找不到的属性
  流程:属性city。在对象文字中找不到属性

我不明白为什么会出现这些错误:这些属性被定义为可选...

您有解决这三个错误的建议吗?

提前致谢!

1 个答案:

答案 0 :(得分:3)

当你覆盖一个方法时,它的参数应该是基类中相应参数的超类型,所以你可以这样做:

class A {
  test(x: number) {
  }
}

class B extends A {
  test(x: number | string) {
  }
}

但你不能这样做:

class A {
  test(x: number | string) {
  }
}

class B extends A {
  test(x: number) {
  }
}