React+TypeScript报错:Type 'string' is not assignable to type 'never' 求助
解决Type 'string' is not assignable to type 'never'错误
错误出在updateCase函数的类型不匹配上——你把value固定为string类型,但ICases接口里的属性并非全是字符串:比如finalActivity是布尔值、materials是数组、timestamp是Timestamp类型。当使用keyof ICases作为键时,TypeScript会推断updatedCase[key]的类型是所有属性类型的交集(也就是never),字符串无法赋值给never,所以报错。
方案1:用泛型约束键与值的类型匹配
修改updateCase为泛型函数,让value的类型严格对应key在ICases中定义的类型:
const updateCase = <K extends keyof ICases>(key: K, value: ICases[K]) => { const updatedCase = newCase ? { ...newCase } : ({} as ICases) updatedCase[key] = value setNewCase(updatedCase) }
这样调用时,TypeScript会自动校验value的类型:比如传入finalActivity时,value必须是boolean;传入caseName时,value必须是string,从根源避免类型不兼容。
方案2:优化初始状态(更简洁)
原代码中newCase初始为undefined,每次更新都要做判断。可以用Partial<ICases>让初始状态支持部分属性,同时简化更新逻辑:
// 初始化为空的Partial对象 const [newCase, setNewCase] = useState<Partial<ICases>>({}) const updateCase = <K extends keyof ICases>(key: K, value: ICases[K]) => { // 直接基于前状态更新,无需额外判断 setNewCase(prev => ({ ...prev, [key]: value })) }
处理特殊类型转换
如果表单输入的是字符串,但对应属性是其他类型(比如Timestamp、Material[]),需要在调用updateCase时手动转换类型:
- 处理
timestamp:
// 假设formTimestampValue是表单输入的日期字符串 updateCase('timestamp', Timestamp.fromDate(new Date(formTimestampValue)))
- 处理
materials数组:
// 假设formMaterialsValue是逗号分隔的字符串,需要转为Material数组 updateCase('materials', formMaterialsValue.split(',').map(item => ({ // 这里根据Material接口定义转换每个元素 name: item.trim() })))
内容的提问来源于stack exchange,提问作者Alula48
相关产品推荐
相关产品推荐

