0

我正在学习如何在一个工作示例中使用 createEntityAdapter,但我无法selectId正确解析 for Update 函数。

工作沙箱:https ://codesandbox.io/s/createentityadapter-demo-forked-5rvl4

entityAdapter 被初始化为:

const entityAdapter = createEntityAdapter<Book>({
  selectId: (book) => book.bookId,
  sortComparer: (a, b) => a.title.localeCompare(b.title)
});

添加值可以正常工作:

const stateOne = entityAdapter.addOne(initialState, {
  bookId: 1,
  title: "hello"
});

const stateTwo = entityAdapter.addMany(stateOne, [
  { bookId: 2, title: "two" },
  { bookId: 3, title: "three" },
  { bookId: 4, title: "four" }
]);

然而 updateOne 在 bookId 上给出了类型错误:

const stateThree = entityAdapter.updateOne(stateTwo, {
  bookId: 3,
   changes: {
     title: "three - change"
   }
});

TS错误:

(property) bookId: number 没有重载匹配这个调用。重载 1 of 2,“(状态:EntityState,更新:更新):EntityState”,给出了以下错误。'{ bookId: number; 类型的参数 更改:{标题:字符串;}; }' 不可分配给“更新”类型的参数。对象字面量只能指定已知属性,并且“更新”类型中不存在“bookId”。重载 2 of 2, '(state: EntityState, update: { payload: Update; type: string; }): EntityState',给出以下错误。'{ bookId: number; 类型的参数 更改:{标题:字符串;}; }' 不可分配给类型为 '{ payload: Update; 的参数。类型:字符串;}'。对象字面量只能指定已知属性,并且类型 '{ payload: Update; 中不存在 'bookId' 类型:字符串;}'.ts(2769)

为什么当我明确定义bookId为我的选择 ID 时会看到此错误?

4

1 回答 1

1

对于这些update*方法,操作负载必须是一个对象,该对象具有完全命名为id和的字段changes,而不管您的数据类型中的实际 ID 字段是什么。因此,这应该可以正常工作:

const stateThree = entityAdapter.updateOne(stateTwo, {
  id: 3,
   changes: {
     title: "three - change"
   }
});
于 2021-09-21T17:14:15.517 回答