Redux Toolkit createEntityAdapter调用CRUD方法时TS类型错误如何解决?
报错原因
报错是类型不匹配导致的,store.getState()返回的是Redux的整个根状态对象,结构是{ books: EntityState<Book> },而booksAdapter的CRUD方法第一个参数要求传入的是books切片本身的状态,也就是EntityState<Book>类型,你把多套了一层根状态的对象直接传入,自然不符合类型要求。JS没有静态类型检查所以不会提前报错,但TS会直接拦截类型不匹配的传参。
正确实现方式
1. 命令式调用adapter方法的写法
直接从根状态里取出books字段再传入即可,同时注意你创建adapter时指定了selectId取bookId字段,传入的实体不要写错字段名:
const rootState = store.getState(); // 取出books切片的状态作为入参 const newBooksState = booksAdapter.addOne(rootState.books, { bookId: 4, title: "title 4" });
注意:entityAdapter的所有CRUD方法都是 immutable 操作,只会返回新的状态对象,不会修改原状态,也不会自动更新store里的状态。如果需要同步更新store的状态,还是推荐走标准的dispatch流程。
2. 可选:补充RootState类型定义(优化类型提示)
你可以提前定义全局的RootState类型,后续使用状态时类型校验会更准确:
// 在store配置文件中导出RootState类型 export type RootState = ReturnType<typeof store.getState>; // 业务代码中使用时可以明确标注类型 const rootState: RootState = store.getState();
内容的提问来源于stack exchange,提问作者Laurence Fass
相关产品推荐
相关产品推荐

