Flow和Object.getOwnPropertyNames

时间:2018-02-23 16:41:59

标签: javascript ecmascript-5

我在使用流输入代码时出现问题。我想要实现的是一个深度冻结和对象的递归函数。我有以下实现:

const isObject: (any => boolean) = object => (
  object !== null && typeof object === 'object'
)

type TObject = Object | any[]
export const deepFreeze: (TObject => TObject) = object => {
  // Actually this doesn't need to be fixed, because an array is an object and
  // it's properties can thus be enumerated.
  // $FlowFixMe
  const ownPropNames = Object.getOwnPropertyNames(object)

  each(ownPropNames, name => {
    const prop = object[name]
    if (isObject(prop)) deepFreeze(prop)
  })

  return Object.freeze(object)
}

此代码适用于对象和数组(技术上也是对象)。但是流量不会接受它,甚至没有$FlowFixMe评论。 Flow说明如下:

Screenshot of flow error

我想这是因为Object.getOwnPropertyNames被输入只接受对象,因为如果我用空对象而不是我的变量来调用它,那么错误就会消失。如果我用TObject替换Object,它们也会消失,但当然我不能用数组调用该函数。所以

  1. 为什么这个错误信息如此令人困惑?它不必对问题做任何事情(如果我正确解释的话)
  2. 为什么它不接受数组,它应该是,因为它是一个具有可枚举属性名称的对象(即' 0',' 1',.. 。,'长度')
  3. 建议将不胜感激。

0 个答案:

没有答案