我在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;
}
答案 0 :(得分:1)
.js.flow
文件,那么 .js
文件并不意味着与.js
对应文件并排放置。目的是让人们通过以下方式在npm上发布流类型声明:(a)转换原始源文件,以便人们可以在没有自己的转换步骤的情况下运行它们,以及(b)将.flow
扩展名添加到原始源文件,仍然有类型,所以Flow可以检查。 flow-typed出于各种原因优于此方法,但这是一个单独的问题。
.js.flow
个文件不意味着用作.h
- 样式声明文件。最有可能的解决方案是,只需删除.js.flow
个文件即可。当我在没有.js.flow
文件的情况下测试你的例子时,它很好地进行了检查。