Flowtype类声明与它的实现不兼容

时间:2016-10-19 11:10:00

标签: javascript flowtype

我在B文件中定义了一些类(在此示例中,它名为b.js),并且它在b.js.flow文件中定义了声明。我假设flowtype将类与它的声明相关联,但不幸的是,当我尝试使用一些接受类B实例的函数时,它的方法flowtype出现以下错误:

b.js:9
  9:     return this.a.foo(this)
                ^^^^^^^^^^^^^^^^ call of method `foo`
  5: export default class B {
                          ^ B. This type is incompatible with
  6:   foo(b: B): null;
              ^ B. See: a.js.flow:6

我猜这是由treating classes as nominal types造成的。有没有办法将类实现与它的声明相关联以防止出现此错误?

我用于测试的文件的完整内容:

a.js:

// @flow

import type B from './b'

export default class A {
  foo(b: B) {
    return null
  }
}

a.js.flow:

// @flow

import type B from './b'

declare export default class A {
  foo(b: B): null;
}

b.js:

// @flow

import A from './a'

export default class B {
  a: A;

  bar() {
    return this.a.foo(this)
  }
}

b.js.flow:

// @flow

import type A from './a'

declare export default class B {
  a: A;
  bar(): null;
}

1 个答案:

答案 0 :(得分:1)

如果Flow也检查了.js.flow文件,那么

.js文件并不意味着与.js对应文件并排放置。目的是让人们通过以下方式在npm上发布流类型声明:(a)转换原始源文件,以便人们可以在没有自己的转换步骤的情况下运行它们,以及(b)将.flow扩展名添加到原始源文件,仍然有类型,所以Flow可以检查。 flow-typed出于各种原因优于此方法,但这是一个单独的问题。

.js.flow个文件意味着用作.h - 样式声明文件。最有可能的解决方案是,只需删除.js.flow个文件即可。当我在没有.js.flow文件的情况下测试你的例子时,它很好地进行了检查。