Flow

时间:2018-01-28 21:06:34

标签: javascript flowtype

如何在Flow中定义可迭代类?

以下代码(在try flow中):

// @flow

class A {
  [Symbol.iterator](): Iterator<string> {
    return {
      next() {
        return {
          done: true
        }
      }
    }
  }
}

报告错误

4:   [Symbol.iterator](): Iterator<string> {
     ^ computed property keys not supported

根据Flow问题Flow doesn't like Symbols as object keys,如果符号不可能,则直接使用。

1 个答案:

答案 0 :(得分:3)

您必须使用一些变通方法,但您可以定义可迭代类。如果您查看Flow的built-in definitions,您会看到Flow内部使用名为@@iterator的属性作为[Symbol.iterator]的替代。您需要做的是在类上定义两个属性:[Symbol.iterator]以获取运行时迭代器功能,以及@@iterator以便Flow知道类迭代器的类型检查功能。

如您所知,如果您尝试定义属性[Symbol.iterator],Flow将抛出错误。您可以使用// $FlowFixMe注释来解决这个问题:

// $FlowFixMe
[Symbol.iterator](): Iterator<string> { /* ... */ }

另一方面,@@iterator不是Flow之外的有效属性名称。例如,Babel会抛出语法错误。但是@@iterator无论如何都不需要在运行时存在,因此您可以在Flow注释中定义它,以便只有Flow才能看到它。把它们放在一起你得到:

export class A {
  // $FlowFixMe
  [Symbol.iterator](): Iterator<string> {
    return {
      next() {
        return {
          done: true
        }
      }
    }
  }

  /*::
  @@iterator(): Iterator<string> {
    // $FlowFixMe
    return this[Symbol.iterator]()
  }
  */
}

请注意该注释的特殊格式:它必须以精确字符/*::开头,以使Flow将注释的内容解释为声明。