我正在阅读:https://github.com/pburtchaell/redux-promise-middleware/blob/master/src/index.js
我知道...
被用作对象传播。我知道!!
用于将任何东西转换为具有相同真实性的布尔值。
然而,当他们像...!!
一样整理时,他们知道这是什么意思?我无法理解最后一行:
{
...resolveAction,
...isAction(rejected) ? rejected : {
...!!rejected && { payload: rejected }
}
...resolveAction
只是传播resolveAction
。...isAction(rejected) ?
会检查rejected
是否解决了某项操作,然后将其传播。 (也不确定这个)rejected
添加到对象{...!!rejected && { payload: rejected }
??????????????? ...!!
如何有效的语法?有两种选择:
如果它首先传播对象,那么!!
将应用于所有传播键
如果首先应用!!
,则它是一个布尔值,并且无法传播。
所以它没有任何意义,或者我错过了一些东西,因为考虑到代码,我认为它试图传播一个布尔值。
答案 0 :(得分:3)
好的,所以在下载了npm模块并浏览了转换后的代码后,我找到了一行:
return dispatch(isThunk(rejected) ? rejected.bind(null, resolveAction) : _extends({}, resolveAction, isAction(rejected) ? rejected : _extends({}, !!rejected && { payload: rejected })));
其中相关部分在这里:
_extends({}, !!rejected && { payload: rejected })
基本上如果!!rejected
为真,那么它会将有效负载扩展到对象中。如果不是_extends({}, false)
,则只返回{}
。
这项工作的关键是...
的优先级低于整行中的任何其他运算符。考虑到这一点,你可以开始理解它。
答案 1 :(得分:1)
奇怪的语法
{...!!rejected && { payload: rejected }}
被解析为
{ ... ((!!rejected) && { payload: rejected }) }
确实!!
确实将rejected
强制转换为布尔值,然后在真实时将其计算到对象。写这个的更好方法是
{ ...(rejected ? {payload: rejected} : null) }
当然整个内部对象文字是多余的。它可能只是
{
...resolveAction,
...(isAction(rejected) ? rejected : (rejected ? {payload: rejected} : null))
}
(如你所知,省略括号)