如何在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,如果符号不可能,则直接使用。
答案 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将注释的内容解释为声明。