【问题标题】:Iterable class in FlowFlow中的可迭代类
【发布时间】:2018-01-28 21:06:33
【问题描述】:

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,如果无法使用符号,它看起来就像直接使用。

【问题讨论】:

    标签: javascript flowtype


    【解决方案1】:

    您必须使用一些解决方法,但您可以定义一个可迭代的类。如果您查看 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 将评论的内容解释为声明。

    【讨论】:

      猜你喜欢
      • 2019-10-07
      • 1970-01-01
      • 2018-08-31
      • 2019-07-02
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多