TS2345错误:BookUpdateParseInput无法分配给QueryDeepPartialEntity<Book>如何解决
TypeScript类型不兼容问题修复方案
错误根因
你使用的TypeORM Repository.update() 方法,要求传入的关联字段(此处为author)仅能接受关联实体的主键值(此处为数字类型的作者ID)或SQL函数,但是你parseInput方法返回的BookUpdateParseInput对象里author字段是完整的Author实体对象,因此触发类型校验不通过。
修复方案
方案1:修改parseInput返回值,仅返回author主键
调整parseInput方法逻辑,解析到author字段时仅返回主键ID即可:
// parseInput方法内部处理示例 async parseInput(input: BookUpdateInput): Promise<QueryDeepPartialEntity<Book>> { const parsed = /* 原有解析逻辑 */ // 新增author字段处理逻辑 if (parsed.author) { parsed.author = parsed.author.id } return parsed }
方案2:调用update方法前单独处理author字段
如果不方便修改parseInput的通用逻辑,可以在调用update前单独处理入参:
const parsedInput = await this.parseInput(input); const updatePayload = { ...parsedInput, // 存在author时取ID,否则保持undefined ...(parsedInput.author ? { author: parsedInput.author.id } : {}) } await this.bookRepository.update(bookId.id, updatePayload);
方案3:改用save方法执行更新
如果确实需要传入完整关联实体做更新,可以改用支持实体对象入参的save方法:
const existingBook = await this.bookRepository.findOneBy({ id: bookId.id }); if (!existingBook) throw new Error('目标书籍不存在'); Object.assign(existingBook, await this.parseInput(input)); await this.bookRepository.save(existingBook);
修改完成后重新执行类型校验,QueryDeepPartialEntity<Book>的author字段会匹配到数字类型的ID,报错即可消失。
内容的提问来源于stack exchange,提问作者Valuu Gottelli
相关产品推荐
相关产品推荐

