javascript - 在 Typescript 中向创建的 Redux Store 添加属性

标签 javascript reactjs typescript redux redux-saga

当我在 Typescript 中创建新的 Redux Store 时,我在添加属性时遇到问题:

const bindMiddleware = middleware => {
  if (process.env.NODE_ENV !== 'production') {
    const { composeWithDevTools } = require('redux-devtools-extension')
    return composeWithDevTools(applyMiddleware(...middleware))
  }
  return applyMiddleware(...middleware)
}

function configureStore (initialState = exampleInitialState) {
  const sagaMiddleware = createSagaMiddleware()
  const store = createStore(
    rootReducer,
    initialState,
    bindMiddleware([sagaMiddleware])
  )

  store.sagaTask = sagaMiddleware.run(rootSaga)

  return store
}

export default configureStore

出现以下错误消息:

27:9 Property 'sagaTask' does not exist on type 'Store<{ error: any; count: number; lastUpdate: number; light: boolean; placeholderData: any; } | { lastUpdate: any; light: boolean; count: number; error: boolean; placeholderData: any; }, any>'.
    25 |   )
    26 | 
  > 27 |   store.sagaTask = sagaMiddleware.run(rootSaga)
       |         ^
    28 | 
    29 |   return store
    30 | }

有什么建议吗?

最佳答案

@types/
| - redux.d.ts
src/
| ...
| ... store.ts

redux.d.ts

import * as Redux from "redux"

declare module "redux" {
  export interface Store {
    sagaTask: ... // provide the types for `store.sagaTask` here 
  }
}

store.ts

const store = createStore(...)
store.sagaTask = ...

这被称为 declaration merging / module augmentation

您还需要设置 tsconfig.json 以从此 @types 目录读取类型。将 "typeRoots": [ "./@types", "./node_modules/@types"] 添加到此文件中(注意:这些是相对于您的 baseDir 的,因此进行相应修改。

另请注意,您正在您的类型和您编写的代码之间创建一个契约。如果您未能正确设置中间件,sagaTask 在类型中将是 Required,但实际上是 undefined

关于javascript - 在 Typescript 中向创建的 Redux Store 添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57649207/

相关文章:

javascript - 在 render 中调用方法或使用 getter

javascript - 如何使用 Javascript 删除点击时的 HTML div

javascript - ionic angular 对于 ng-bind 和 {{}} 的工作方式不同不知道为什么?

javascript - 在 Oracle Apex Interactive Report 中保存分页

javascript - 当点击另一个文本框外部时,jQuery MLKeyboard 不会消失

javascript - 如何在php中设置li激活

javascript - 从未被称为 Sinon Spy

javascript - 无法使用 firebase.firestore.FieldValue.increment

javascript - 如何在 TypeScript 中使用 mocha 模拟 axios 依赖?

javascript - TypeScript - 将动态属性名称传递给子级