【问题标题】:FlowJS: types inheritanceFlowJS:类型继承
【发布时间】:2017-01-23 11:39:27
【问题描述】:

我正在为我的项目测试 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 是 Fl​​owJS 类型“扩展”PaginationOptions

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

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

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

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

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

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

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

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

您对修复这三个错误有什么建议吗?

提前致谢!

【问题讨论】:

  • @nat-mote 我可以知道为什么标签flow-js 被删除了吗?这个问题完全是关于flow-js的,我把这个标签去掉是很无意义的……
  • 查看该标签的描述,它是针对不同项目的,不是流类型检查器。你想要的标签是流类型:stackoverflow.com/tags/flow-js/info
  • 好的,谢谢你的信息:)

标签: inheritance intersection flowtype type-alias


【解决方案1】:

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

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) {
  }
}

【讨论】:

  • 感谢您的回复 :) 我认为这种行为很奇怪,但为什么不...知道如何解决我的问题并使编译器满意吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2018-09-27
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多