Redux-createStore。类型的参数不能分配给类型'DeepPartial <any>'的参数

时间:2018-10-07 07:31:44

标签: reactjs typescript redux

开始编译时,总是会出现堆栈错误。表示我在initialState中的store已损坏或其他人。此外,如果我只是从initialState中切断了store prop,我的应用程序就可以正常编译,但这不是一个好的解决方案。

我也承认该软件可以在该应用的.js文件版本上正常运行。好像redux的TypeScript有一些问题。

错误:

  

TS2345:类型为'{titleSwitch:string;的参数}'不可分配   到“ DeepPartial”类型的参数。属性“ titleSwitch”为   与索引签名不兼容。类型“字符串”不可分配给   键入“ DeepPartial”。

我的一部分代码:

import { createStore } from 'redux'
import reducer from './reducers'

const initialState = {
  titleSwitch: false
}

const store = () => {
  return createStore(
    reducer,
    initialState // TS Error
  )
}

经过测试:

"redux": "^4.0.0",
"typescript": "^3.1.1",
"webpack": "^4.16.5"

3 个答案:

答案 0 :(得分:2)

如果该代码在JS中有效,但仅由于在TypeScript中键入而失败,我建议您使用“ any”忽略它:

const store = () =>
  createStore(
    reducer,
    initialState as any
  )

现在您要问我:但是为什么???如果您愿意的话,只要绕过问题,TypeScript的全部目的就是什么。

这样做的原因是,如果您要这样做是为了工作,那么您需要一直考虑与类型系统抗争的价值:

  • 这两种方法都可以帮助您避免犯错,使开发更容易,这是严格输入的真正动机
  • 这两种方法都不利于您,阻止您在JS中做合法的事情,它不会使您的代码更健壮,因为所涉及的代码是您从未真正接触过的东西(换句话说:如果使用正确的键入不能更改结果中的任何内容)

TypeScript是flexibility in mind发明的,在与JS库进行互操作时具有真正的威力。到处都使用完美且严格的类型只有从一开始就以这种方式设计的语言才有意义,而JS并非如此。

现在不要误会我的意思。我很确定您的问题有解决方案。我的推理更多是关于:您实际上是否需要解决?会为您的应用带来有用的东西吗?有时候这不值得。

答案 1 :(得分:1)

我认为塞西尔的回答是一个很好的答案。我只想补充一点,DeepPartial类型是一种递归的Partial,当您将多个reducer与combineReducers结合使用时,它确实可以很好地工作。对于典型的redux状态,您的情况基本上太琐碎了,因为状态的叶子不是可以“部分”化的对象。

是的,对于这种游乐场情况,TS并没有太大的价值。一旦状态和化简器变得更加复杂,类型检查应会再次正常工作,并且您可以删除任意内容。

答案 2 :(得分:0)

这是因为类型不匹配,可能是在reducer和initialState之间。

对我来说,这是因为我在reducer中为action使用了过于通用的界面:

interface FluxStandardAction {
  type: string
  payload?: any
  error?: boolean
  meta?: any
}

因此,减速器的返回值action.payload的类型必须为any

请参见https://redux.js.org/recipes/usage-with-typescript