我使用immutable.js来管理配置对象,例如
config.js
export default Immutable.fromJS({
foo: 'FOO',
bar: {
// ...
}
});
我想覆盖getter函数,以便访问undefined
属性会引发错误。
我是如何做到的,因为结果对象的每个setter方法都会创建一个新的Immutable实例(实际上会覆盖任何猴子修补)?
答案 0 :(得分:0)
通常我不希望它抛出错误,只是处理undefined而不会导致代码致命破坏。要抛出特定的错误,我可能会使用try / catch,但这非常低效。
为防止破损,我会做这样的事情。
我的动机主要是我的召唤。未定义的poops本身非常难,并且在整个地方正确初始化有帮助,但并不能捕获所有边缘情况。我只想要数据或未定义而没有任何破损。如果我希望它进行更改,特定类型检查会导致我以后做更多工作。
这个更宽松的版本解决了更多的边缘情况(大多数,如果不是所有的扩展类型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
}
}
请告诉我我的要求或告诉我不。不要爆炸。我相信下划线也有类似之处。