javascript - 没有显式类型属性的操作

标签 javascript redux redux-thunk

如你所见on this line在 Redux 源代码中,操作必须具有 type 属性。在real world在源代码存储库中的示例中,有一个这样的操作,没有声明 type 属性。

function fetchUser(login) { 
10   return { 
11     [CALL_API]: { 
12       types: [ USER_REQUEST, USER_SUCCESS, USER_FAILURE ], 
13       endpoint: `users/${login}`, 
14       schema: Schemas.USER 
15     } 
16   } 
17 } 

CALL_API 是一个 JavaScript 符号 here

export const CALL_API = Symbol('Call API')

在旁注中,从 Mozilla 站点,您似乎访问了带有数组括号的符号

var sym = Symbol("foo");
var obj = {[sym]: 1};

因此,回到 redux 代码,处理没有显式类型的操作的中间件似乎访问由 CALL_API 创建的属性...

export default store => next => action => { 
84   const callAPI = action[CALL_API] 
85   if (typeof callAPI === 'undefined') { 
86     return next(action) 
87   }  function fetchUser(login) { 
10   return { 
11     [CALL_API]: { 
12       types: [ USER_REQUEST, USER_SUCCESS, USER_FAILURE ], 
13       endpoint: `users/${login}`, 
14       schema: Schemas.USER 
15     } 
16   } 
17 } 

回到上面引用的第一个代码,如果我像这样从调用 api 周围移除数组括号

 function fetchUser(login) { 
    10   return { 
    11     CALL_API: { 

我收到错误消息,“操作可能没有未定义的“类型”属性”。

问题:例如,在 fetchUser 函数中(正确)使用符号如何满足操作类型属性的要求?

最佳答案

在对象字面量中使用方括号是较新的 ES6 语法的一部分。它允许您使用表达式在对象中定义键,其中可以包含变量的值:

const keyName = "test";
const obj = { [keyName + "Key"] : 42};
// result: { "testKey" : 42}

符号也可以用作对象键(参见 http://blog.keithcirkel.co.uk/metaprogramming-in-es6-symbols/ )以获得一些解释。

当您将 [CALL_API] 括起来时,您是在说“使用 CALL_API 变量的作为键” .当您使用方括号时,您就是在说“使用文字字符串 "CALL_API" 作为键名”。

然后中间件正在寻找一个操作对象,该对象具有与 CALL_API 符号正确匹配的键。当它看到一个时,它会停止它,并且不会将它传递给 reducer 。因此,当您删除括号时,您实际上是在分派(dispatch)一个类似于 {"CALL_API": {} } 的操作。这与中间件正在寻找的内容不匹配,它确实到达了 reducers,然后类型检查失败。

关于javascript - 没有显式类型属性的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37571746/

相关文章:

reactjs - React-Router v4 onEnter 替换

javascript - 使用 :nth-child in selector 忽略不可见元素

javascript - Radwindow OnClientClose 在打开时触发

javascript - 从条形图钻取饼图 - xAxis 仍然存在

javascript - jQuery 未捕获类型错误 : Cannot read property 'nodeType' of undefined

javascript - React Redux Router 不路由

javascript - 从react-router中的url获取参数

forms - React.js - 将更改处理程序函数传递给深层嵌套表单组件

javascript - 如何在异步 thunk 完成后干净地执行同步操作

reactjs - Typescript Redux Thunk(类型)