TypeScript实现对象局部更新的泛型工具函数类型报错如何解决
问题原因
你定义的工具函数第二个参数类型要求传入的更新对象所有字段均为必填非undefined,和你实际传入的Partial类型输入存在类型冲突:
- 原函数的
updateInput类型为{ [key in K]: T[K] },要求每个K对应的属性值必须和原实例字段类型完全匹配,不允许出现undefined - 你传入的
input是Partial类型,内部字段的类型为原类型 | undefined,和函数要求的非空类型不匹配,因此触发报错。
修复方案
修改工具函数的泛型定义,将更新对象的字段设为可选,同时保留「仅允许传入实例字段子集、禁止传入额外字段」的校验规则:
function updateEntity<T, K extends keyof T>( entity: T, // 调整更新对象的字段为可选,适配Partial类型的输入 updateInput: { [key in K]?: T[K] }, ): void { Object.keys(updateInput).forEach((key) => { const typedKey = key as K; const updateValue = updateInput[typedKey]; // 可选添加非空判断,避免把undefined赋值给实例的非空字段 if (updateValue !== undefined) { entity[typedKey] = updateValue; } }); }
如果需要更简洁的写法,也可以直接将updateInput的类型替换为Partial<Pick<T, K>>,二者效果完全等价。修改后你的原有调用逻辑不会再触发报错,传入实例不存在的字段时TS也会自动抛出类型错误,符合你的需求。
内容的提问来源于stack exchange,提问作者vlio20
相关产品推荐
相关产品推荐

