javascript - 覆盖 Immutable.js 实例的 getter 逻辑

标签 javascript immutable.js

我正在使用管理配置对象,例如

config.js

export default Immutable.fromJS({
    foo: 'FOO',
    bar: {
        // ...
    }
});

我想覆盖 getter 函数,以便访问 未定义 属性会引发错误。

鉴于结果对象的每个 setter 方法都会创建一个 Immutable 的新实例(实际上覆盖任何猴子修补),我该怎么做?

最佳答案

一般来说,我不希望它抛出错误,只需处理未定义而不会导致代码致命中断。要抛出特定错误,我可能会使用 try/catch,但这效率非常低。

为了防止破损,我做了这样的事情。

我的动机主要是我对未定义粪便的调用 .get 本身非常困难,并且在整个地方正确初始化会有所帮助,但不能捕获所有边缘情况。我只想要数据或未定义且没有任何损坏。如果我想要进行更改,特定的类型检查会让我稍后做更多的工作。

这个更宽松的版本解决了比特定类型检查更多的边缘情况(大多数(如果不是全部的话)扩展类型 Iterable 具有 .get,并且最终获得所有数据)(这通常只会在您尝试更新时节省您的时间)类型错误等)。

/* getValid: Checks for valid ImmutableJS type Iterable

    returns valid Iterable, valid Iterable child data, or undefined

    Iterable.isIterable(maybeIterable) && maybeIterable.get(['data', key], Map()), becomes
    getValid(maybeIterable, ['data', key], Map())

    But wait! There's more! As a result:
    getValid(maybeIterable) returns the maybeIterable or undefined 
    and we can still say getValid(maybeIterable, null, Map()) returns the maybeIterable or Map()            */

export const getValid = (maybeIterable, path, getInstead) =>
  Iterable.isIterable(maybeIterable) && path
    ? ((typeof path === 'object' && maybeIterable.getIn(path, getInstead)) || maybeIterable.get(path, getInstead))
    : Iterable.isIterable(maybeIterable) && maybeIterable || getInstead;


//Here is an untested version that a friend requested. It is slightly easier to grok.

export const getValid = (maybeIterable, path, getInstead) => {
  if(valid(maybeIterable)) {                 // Check if it is valid
    if(path) {                                        // Check if it has a key
      if(typeof path === 'object') {     // Check if it is an 'array'
        return maybeIterable.getIn(path, getInstead) // Get your stuff
      } else {
        maybeIterable.get(path, getInstead)          // Get your stuff
      }
    } else {
      return maybeIterable || getInstead;                 // No key? just return the valid Iterable
    }
  } else {
    return undefined;                       // Not valid, return undefined, perhaps should return false here
  }
}

只要给我我想要的东西,或者告诉我不。别爆炸。我相信下划线也会做类似的事情。

关于javascript - 覆盖 Immutable.js 实例的 getter 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34994965/

相关文章:

javascript - Jquery 从列表中检索特定 div 的宽度

javascript - 如何将 Immutable.js 与 redux 一起使用?

react-redux - Immutable.js 更新 Map 中的多个键值

javascript - Circliful 插件在 ng 重复内无法工作

javascript - 在JS上淡入/淡出显示消息

javascript - 使用 setTimeout(fn, 0) 将代码执行推迟到当前调用堆栈之后是否可靠?

javascript - Immutable.js 有条件地更新 Map

reactjs - 如何检查提供给 React 组件的属性是否是 Immutable.js Record with Flow 的实例?

javascript - polymer 数据绑定(bind)和 Immutable.js 结合在一起

javascript - Bootstrap-Date 选择器日期字段未保存到 mysql 数据库