我试图创建一个使用另一个模块声明的模块接口声明,但它不能正常工作。这是一个MCVE。我知道我可以直接在本地模块上添加类型注释,但我试图描述我对第三方模块的体验。
.flowconfig:
[ignore]
[include]
[libs]
lib
[options]
[version]
^0.27.0
foo.js:
export class Foo {
foo() {
return 'foo';
}
}
bar.js:
import { Foo } from './foo';
export class Bar extends Foo {
bar() {
return 'bar';
}
makeFoo() {
return new Foo();
}
}
LIB / foo.js:
declare module './foo' {
declare class Foo {
foo(): string;
}
}
LIB / bar.js:
import { Foo } from './foo';
// Same result if:
// import { Foo } from '../foo';
declare module './bar' {
declare class Bar extends Foo {
bar(): string;
makeFoo(): Foo;
}
}
index.js:
/* @flow */
import { Foo } from './foo';
import { Bar } from './bar';
const bar = new Bar();
const b: number = bar.bar(); // A. wrong const type
const bf: number = bar.foo(); // B. wrong const type
bar.typo(); // C. no such method
const foo = bar.makeFoo();
foo.foo();
foo.bar(); // D. no such method
flow
&#39}的结果是:
index.js:6
6: const b: number = bar.bar(); // wrong const type
^^^^^^^^^ call of method `bar`
6: const b: number = bar.bar(); // wrong const type
^^^^^^^^^ string. This type is incompatible with
6: const b: number = bar.bar(); // wrong const type
^^^^^^ number
Found 1 error
我预计有4个错误(index.js
中的A,B,C和D)但只得到A.我似乎无法在Foo
中正确导入lib/bar.js
以便{ {1}}变成类似通配符的东西。
有没有办法将模块的类型正确导入另一个接口声明?我错过了什么吗?任何帮助表示赞赏。
[编辑]
我在flow-typed使用Foo
,which is declared globally时看到了一些声明,但没有导入它。但是我想在Component
in react
module这样的模块中使用类型。
答案 0 :(得分:1)
我不认为您应该创建组件的声明文件,因为Flow直接使用这些源。当您需要对类型的引用时,只需import
类。
在您当前的示例中,您只是错过了文件顶部的/* @flow */
(bar.js
,foo.js
)。
答案 1 :(得分:0)
不幸的是,Flow不支持扩展/覆盖流/ lib类型:
https://github.com/facebook/flow/issues/396
我开始做的是:
flow-typed install express@4.x.x
express_v4.x.x.js
从flow-typed / npm /移动到flow-typed /(外部流类型/ npm /所以它不会被未来的流式安装覆盖,并且内部流式输入/ so flow会自动使declare blah
语句全局化)在declare class express$Request...
正下方(所以它很容易找到,所以它在declare module...
内使用的地方之上,我把:< / p>
declare class express$Request extends express$Request {
user: any;
isAuthenticated(): boolean;
session: {
loginForwardUrl: ?string;
};
}
我这样做而不是将我的自定义道具放在原始类上,这样就可以很容易地看到哪些道具是自定义的。