Typescript赋值报错string | number不可分配给never类型ts(2322)如何解决
错误原因
当前函数定义未关联key与val的类型匹配关系:key为IDevice的任意属性键,val为独立的string | number类型,TypeScript 无法保证传入的val类型与key对应的IDevice属性类型一致,因此将两者的匹配类型判定为never,触发赋值报错。
解决方案
推荐方案:添加泛型约束(保留完整类型校验能力)
给函数增加泛型绑定key和对应val的类型,无需添加@ts-ignore即可通过校验:
const updateItem = <K extends keyof IDevice>(key: K, val: IDevice[K], i: number) => { const devices = [...formData.devices]; const device = devices[i]; device[key] = val; devices[i] = device; setFormData({ ...formData, devices }); };
该方案下调用函数时,TypeScript会自动校验参数合法性:例如传入key='name'时仅允许val为字符串类型,传入key='width'时仅允许val为数字类型,不会损失类型安全。
临时兼容方案(不推荐,会丢失类型校验)
如果仅需要快速消除报错,可以对val做类型断言:
// @ts-ignore 注释也可以同时移除 device[key] = val as never;
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

