TypeScript通用对象更新函数Partial参数类型不兼容报错如何解决?
问题根因
你遇到的报错核心来自两个层面:
- 你定义的
Point是可辨识联合类型,Partial<Point>允许修改category为RoutePoint对应的枚举值,也包含RoutePoint独有的speed属性,和ThreatPoint的固定属性定义冲突 - 原
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
相关产品推荐
相关产品推荐

