TS2322错误求助:string|number|boolean|Dayjs无法赋值给never类型
错误解释与修复
错误原因
这个TS2322错误的核心是类型安全校验不通过:
- 你定义的
newValue是string | number | boolean | Dayjs的联合类型,但kurs对象里的每个属性都有自己明确的专属类型(比如某属性是string,另一属性是number)。 - TypeScript无法确保你传入的
newValue类型和what指定的属性类型完全匹配,为了避免不安全的赋值操作,它把tmpKurs[what]的类型推断成了never——因为没有任何类型能同时兼容kurs所有属性的类型和newValue的联合类型,自然无法完成赋值。
修复方案
用泛型绑定what和newValue的类型关联,让TypeScript明确每个属性对应的正确值类型:
function changeKurs<K extends keyof typeof kurs>(what: K, newValue: typeof kurs[K]){ const tmpKurs = cloneDeep( kurs ); if (Object.prototype.hasOwnProperty.call(tmpKurs, what)) { tmpKurs[what] = newValue; setkurs(tmpKurs); }else { console.error(`Property '${what}' does not exist in kurs`); } }
修复说明
- 泛型
K被约束为keyof typeof kurs,也就是kurs的所有属性名。 newValue的类型指定为typeof kurs[K],即K对应属性的具体类型。这样当你传入某个属性名时,TypeScript会自动校验newValue的类型是否和该属性类型一致,既保证了类型安全,也解决了赋值错误。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

