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

TypeScript通用对象更新函数Partial参数类型不兼容报错如何解决?

问题根因

你遇到的报错核心来自两个层面:

  1. 你定义的Point是可辨识联合类型,Partial<Point>允许修改category为RoutePoint对应的枚举值,也包含RoutePoint独有的speed属性,和ThreatPoint的固定属性定义冲突
  2. 原updateObject没有显式声明返回值类型,TS会基于Object.assign的类型定义,将返回值推导为oldObject和newValues的交叉类型,当newValues为Partial<Point>时,推导出来的返回类型包含了不符合ThreatPoint要求的分支,所以无法赋值给期望返回ThreatPoint的位置

解决方案

方案1:最简适配(适合你能保证newValues不会包含非法属性的场景)

直接给updateObject显式声明返回值类型为T即可,告知TS返回结果一定和oldObject类型一致:

static updateObject = <T>(oldObject: T, newValues: Partial<T>): T => {
  return Object.assign({}, oldObject, newValues);
};

调用时如果还是有报错,可以手动指定泛型参数:

updateObject<ThreatPoint>(point, newValues as Partial<ThreatPoint>)

方案2:严格类型+运行时过滤(适合需要完全规避非法属性的场景)

如果你需要从类型层面禁止传入oldObject不存在的属性,同时运行时自动过滤多余属性,可以改成如下定义:

// 工具类型:仅保留U中存在于T的属性
type CompatiblePartial<T, U> = {
  [K in keyof U as K extends keyof T ? K : never]: K extends keyof T ? T[K] : never
}

static updateObject = <T extends object, U extends object>(
  oldObject: T,
  newValues: CompatiblePartial<T, U>
): T => {
  // 运行时过滤oldObject不存在的属性
  const filteredValues = Object.fromEntries(
    Object.entries(newValues).filter(([key]) => key in oldObject)
  ) as Partial<T>
  return Object.assign({}, oldObject, filteredValues)
}

这种写法下,哪怕newValues是Partial<Point>类型,类型层面会自动过滤掉不属于ThreatPoint的属性,运行时也不会把多余属性赋值到新对象上,完全规避类型冲突问题。


内容的提问来源于stack exchange,提问作者RouteMapper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:48:02