说我有一个恒定的动物,我用
导入import animals from './animals
说动物不变是:
{
hoofed:[
'horses',
'sheep',
'goats'
],
feline: [
'lions',
'tigers'
],
canine: [
'dogs',
'wolves'
]
}
假设我想为某些动物api构建一个Url查询,并编写以下代码:
const fq = Object.values(animals).reduce((memo, animalList) => memo + `animal:${animalList.join(' animal:')} `, '')
现在这段代码会生成一串动物,用动物和空格分隔,然后进行URL编码并正确匹配目标API表面。
然而,FlowJS拒绝使用以下代码:
13: const fq = Object.values(animals).reduce((memo, animalList) => memo + `animal:${animalList.join(' animal:')} `, '')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call of method `join`. Method cannot be called on
13: const fq = Object.values(animals).reduce((memo, animalList) => memo + `animal:${animalList.join(' animal:')} `, '')
^^^^^^^^ mixed
我的问题是:为什么?数组显然没有混合,它是一个常量,而Object.values 应该返回类型为[string]的东西?
什么是流量检测,我该如何避免?
答案 0 :(得分:4)
Object.values
函数此时返回Array<mixed>
类型。所以你需要将它转换为一个字符串数组数组,如下所示。
let fq: string[][] = (Object.values(animals): any);
fq = fq
.reduce((memo, animalList) => memo + `animal:${animalList.join(' animal:')} `, '')
或使用这样的内联演员:
const fq = ((Object.values(animals): any): string[][])
.reduce((memo, animalList) => memo + `animal:${animalList.join(' animal:')} `, '')
Flow目前无法支持此功能,因为Object.values
功能是in stage-4作为提案。所以它还不是语言的一部分。您不需要使用强制转换解决此问题只是时间问题,只要Object.values
函数是EcmaScript标准的一部分,流程团队就可能正确实现它。