You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:54:42