如何用TypeScript将请求体值赋值给已有对象?解决ts(2322)错误
TypeScript中处理Express PUT请求的对象赋值问题
出现Type 'any' is not assignable to type 'never'错误的核心原因是:Express的req.body默认被推断为any类型,TypeScript在循环遍历foundArticle的键时,无法确认req.body[i]的类型和foundArticle[i]的类型匹配,因此将赋值目标类型推断为never,触发类型不兼容错误。
以下是几种可行的解决方法:
1. 给req.body定义匹配的类型(最推荐)
先定义和foundArticle结构一致的类型接口,再通过Express的Request泛型指定req.body的类型,从根源保证类型安全:
// 定义Article类型,和foundArticle的结构完全匹配 interface Article { title: string; content: string; author?: string; // 补充其他需要的属性 } // 在路由处理函数中指定Request的泛型参数 app.put('/articles/:id', async (req: Request<{ id: string }, {}, Article>, res) => { const foundArticle = await ArticleModel.findById(req.params.id); if (!foundArticle) { return res.status(404).send('Article not found'); } let i: keyof Article; for (i in foundArticle) { // 用!==undefined判断,避免过滤掉0、false等合法值 if (req.body[i] !== undefined) { foundArticle[i] = req.body[i]; } } await foundArticle.save(); res.send(foundArticle); });
2. 临时使用类型断言
如果不想额外定义类型,可以直接将req.body[i]断言为foundArticle[i]的类型,快速绕过类型检查(注意:需自行保证传入的body类型正确,否则可能引发运行时错误):
let i: keyof typeof foundArticle; for (i in foundArticle) { if (req.body[i]) { foundArticle[i] = req.body[i] as typeof foundArticle[i]; } }
3. 用Object.assign批量赋值
通过过滤req.body中属于foundArticle的键,再用Object.assign批量赋值,代码更简洁:
// 先过滤出req.body中存在于foundArticle的键值对 const validUpdates = Object.fromEntries( Object.entries(req.body).filter(([key]) => key in foundArticle) ) as Partial<typeof foundArticle>; // 批量赋值 Object.assign(foundArticle, validUpdates);
内容的提问来源于stack exchange,提问作者Anastasiya Litvinenka
相关产品推荐
相关产品推荐

