如何将模块的类型导入另一个模块接口声明?

时间:2016-06-27 05:49:51

标签: flowtype

我试图创建一个使用另一个模块声明的模块接口声明,但它不能正常工作。这是一个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使用Foowhich is declared globally时看到了一些声明,但没有导入它。但是我想在Component in react module这样的模块中使用类型。

2 个答案:

答案 0 :(得分:1)

我不认为您应该创建组件的声明文件,因为Flow直接使用这些源。当您需要对类型的引用时,只需import类。

在您当前的示例中,您只是错过了文件顶部的/* @flow */bar.jsfoo.js)。

答案 1 :(得分:0)

不幸的是,Flow不支持扩展/覆盖流/ lib类型:

https://github.com/facebook/flow/issues/396

我开始做的是:

  1. flow-typed install express@4.x.x
  2. express_v4.x.x.js从flow-typed / npm /移动到flow-typed /(外部流类型/ npm /所以它不会被未来的流式安装覆盖,并且内部流式输入/ so flow会自动使declare blah语句全局化)
  3. declare class express$Request...正下方(所以它很容易找到,所以它在declare module...内使用的地方之上,我把:< / p>

    declare class express$Request extends express$Request { user: any; isAuthenticated(): boolean; session: { loginForwardUrl: ?string; }; }

  4. 我这样做而不是将我的自定义道具放在原始类上,这样就可以很容易地看到哪些道具是自定义的。