【问题标题】:flowjs: call of method `join`. Method cannot be called on mixedflowjs:调用方法`join`。不能在混合上调用方法
【发布时间】:2017-10-29 16:59:24
【问题描述】:

假设我有一个恒定的动物,我用

导入
import animals from './animals

假设动物常数是:

{
  hoofed:[
    'horses',
    'sheep',
    'goats'
],
  feline: [
  'lions',
  'tigers'
],
  canine: [
    'dogs',
    'wolves'
  ]
}

假设我要构造一个Url查询到一些动物的api,写如下代码:

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] 类型的东西?

什么是流量检测,如何避免?

【问题讨论】:

    标签: javascript types casting ecmascript-6 flowtype


    【解决方案1】:

    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 标准的一部分,流程团队可能会正确实现它。

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 2019-04-10
      • 2013-04-19
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      相关资源
      最近更新 更多