当前位置: 首页 > 知识库问答 >
问题:

react.js - React 的 reduxjs/toolkit 在 typescript 报错的原因?

阚夕
2023-10-24
报错:TS2322: Type  any  is not assignable to type  never 

image.png

const ErrorSlice = createSlice({    name: 'error',    initialState: [],    reducers: {        Publish: (state, action) => {            console.log(action)            state = [...state, action.payload]        },        Consume: () => [],    }})
调用端
await axios    .post(`host`, Params)    .then((data: Response) => data.data.Response)    .catch((e) => {        ErrorState.dispatch(Publish(e.response.data.Error))    })

我不太明白 never 什么意思我给的不是字符么很明显的

共有2个答案

萧心远
2023-10-24

需要使用插件自己的数据类型 PayloadAction

import { createSlice, PayloadAction } from '@reduxjs/toolkit'const ErrorSlice = createSlice({    name: 'error',    initialState: "",    reducers: {        Publish: (_, action: PayloadAction<你自己的类型或者基础类型>) => action.payload,        Consume: () => "",    }})
  • 参考:https://redux.js.org/usage/usage-with-typescript#standard-red...
范承望
2023-10-24

"never" 是 TypeScript 的一个类型,表示一个永远不会出现的值。在函数中,如果你没有返回任何值(或者抛出一个错误),那么 TypeScript 会推断返回类型为 "never"。在你的代码中,Publish reducer 没有返回任何值,所以它的类型被推断为 "never",而你的状态被定义为 "any",所以 TypeScript 报错。

解决这个问题的一种方法是显式地指定 Publish reducer 的返回类型。由于你希望将新的错误添加到状态中,所以你应该返回一个新的状态。你可以使用 ...state 来创建新的状态,因为 TypeScript 可以推断出 "never" 类型应该被扩展成一个数组。

下面是修改后的代码:

const ErrorSlice = createSlice({    name: 'error',    initialState: [],    reducers: {        Publish: (state, action) => {            console.log(action);            return [...state, action.payload]; // 注意这里返回新的状态        },        Consume: () => [],    }});

现在,你的 Publish reducer 返回一个新的状态,TypeScript 应该不会报告任何错误了。

 类似资料:
  • 不是很理解为什么会报错? 在js当中这类代码是可以正常执行的 后续 加了类型的定义any, 报错就消失了.. 但是为什么会有这种情况出现呢? 我在 ts 中不给类型直接赋值, 难道程序识别不出 this.obj 是一个对象吗?

  • const DomElement = lazy(() => import(@/pages/${item.route})) <Suspense><DomElement /> </Suspense> build 之后会报错:Cannot assign to read only property '_status' of object '#<Object>', 但是dev是可以得

  • 大哥们,这个ts报错,原始svg上没t这么解决 其他地方搜不到相关结果

  • 背景 前端由React构建。 后端使用Envoy作为流量网关,listeners的路由部分配置如下: Envoy将下游请求代理到由Go编写的HTTP服务器,服务器内部路由的处理如下: 问题 只要带路径,刷新浏览器就报404。 疑惑 我知道是因为React Router的原因,也知道服务器为Nginx或者httpd时的解决方案。 但通过Envoy➕Go部署时,Envoy的prefix已经将所有路径的

  • useEffect 的依赖项使用了 [],那么内部的 effect 函数只会在初始渲染时执行,那么监听的 onMove 函数应该第一次组件函数执行时创建的 onMove,如果把 useEffectEvent 去掉,那么 canMove 也应该是第一次渲染时使用的 canMove,之后切换 canMove 是不会改变 canMove 的值的。如果使用了 useEffectEvent, 那么 canM

  • reduxjs/toolkit刷新页面后,store 中的数据丢失怎么办? 我想放到 localstorage 中,获取的时候,判断对象是否存在,不存在就把值给 state,结果 state 不让复制,但是直接返回缓存,就失去了响应式,这该咋解决? 网上有说 redux-persist,但是这个比较老,都是 redux 的例子,大家都是怎么解决的?