【问题标题】:Flowtype class declaration incompatible with it's implementationFlowtype 类声明与其实现不兼容
【发布时间】:2016-11-04 00:08:15
【问题描述】:

我在b.js 文件中定义了一些类(在本例中名为B),它是在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;
}

【问题讨论】:

    标签: javascript flowtype


    【解决方案1】:

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

    .js.flow 文件旨在用作.h 样式的声明文件。最有可能的是,最好的解决方案是简单地删除您的 .js.flow 文件。当我在没有 .js.flow 文件的情况下测试您的示例时,它的类型检查很好。

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2015-01-01
      • 1970-01-01
      • 2016-01-11
      相关资源
      最近更新 更多