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

Max*_*vis 2 typescript reactjs redux

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

我也承认它.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
  )
}
Run Code Online (Sandbox Code Playgroud)

经过测试:

"redux": "^4.0.0",
"typescript": "^3.1.1",
"webpack": "^4.16.5"
Run Code Online (Sandbox Code Playgroud)

Cec*_*ile 5

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

const store = () =>
  createStore(
    reducer,
    initialState as any
  )
Run Code Online (Sandbox Code Playgroud)

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

这样做的原因是,如果要在工作中这样做,则需要始终考虑使用类型系统的价值:

  • 它可以帮助您避免犯错,使开发更轻松,这是严格输入的真正动机
  • 要么它对您不利,就使您无法在JS中做合法的事情,但它不会使您的代码更健壮,因为所涉及的代码是您从未真正接触过的东西(换句话说:如果使用正确的键入不会更改任何代码,结果)

TypeScript的发明考虑了灵活性,并且在与JS库进行互操作时发挥了真正的威力。仅从一开始就以这种方式设计的语言在所有地方都使用完美且严格的类型才有意义,而JS并非如此。

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

  • 哦谢谢!这真的是工作!所以,我不能说我实际上需要我的 `initialState` 作为 `any` 类型检查,它可能是一个 `object`。这意味着我将“initialState 设置为对象”并且它也正常工作。无论如何,我认为我需要更多的 TypeScript 练习。但是,现在再次感谢您!:) (2认同)
  • 很好的哲学解释! (2认同)