报错:TS2322: Type any is not assignable to type never
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
什么意思我给的不是字符么很明显的
需要使用插件自己的数据类型 PayloadAction
import { createSlice, PayloadAction } from '@reduxjs/toolkit'const ErrorSlice = createSlice({ name: 'error', initialState: "", reducers: { Publish: (_, action: PayloadAction<你自己的类型或者基础类型>) => action.payload, Consume: () => "", }})
"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 应该不会报告任何错误了。
const DomElement = lazy(() => import(@/pages/${item.route})) <Suspense><DomElement /> </Suspense> build 之后会报错:Cannot assign to read only property '_status' of object '#<Object>', 但是dev是可以得
不是很理解为什么会报错? 在js当中这类代码是可以正常执行的 后续 加了类型的定义any, 报错就消失了.. 但是为什么会有这种情况出现呢? 我在 ts 中不给类型直接赋值, 难道程序识别不出 this.obj 是一个对象吗?
背景 前端由React构建。 后端使用Envoy作为流量网关,listeners的路由部分配置如下: Envoy将下游请求代理到由Go编写的HTTP服务器,服务器内部路由的处理如下: 问题 只要带路径,刷新浏览器就报404。 疑惑 我知道是因为React Router的原因,也知道服务器为Nginx或者httpd时的解决方案。 但通过Envoy➕Go部署时,Envoy的prefix已经将所有路径的
reduxjs/toolkit刷新页面后,store 中的数据丢失怎么办? 我想放到 localstorage 中,获取的时候,判断对象是否存在,不存在就把值给 state,结果 state 不让复制,但是直接返回缓存,就失去了响应式,这该咋解决? 网上有说 redux-persist,但是这个比较老,都是 redux 的例子,大家都是怎么解决的?
useEffect 的依赖项使用了 [],那么内部的 effect 函数只会在初始渲染时执行,那么监听的 onMove 函数应该第一次组件函数执行时创建的 onMove,如果把 useEffectEvent 去掉,那么 canMove 也应该是第一次渲染时使用的 canMove,之后切换 canMove 是不会改变 canMove 的值的。如果使用了 useEffectEvent, 那么 canM
背景: 在vue3+ts+vite项目中: vue文件:import.meta.env代码能正常访问 ts文件:import.meta.env文件有编译报错 尝试1: 在tsconfig.json中添加"types": [ "vite/client" ]