TypeScript赋值类型收窄失效:类型无法赋值给'never'
解决TypeScript动态修改对象属性时的
never类型错误 你遇到的这个类型错误,核心原因是TypeScript编译器无法在循环中追踪formFields[i]的具体类型——尽管你知道field对应myType的某个键,但编译器只把它当成keyof myType联合类型,就算通过typeof test[field]判断类型,也没法将test[field]的类型和赋值的类型精准匹配,最终导致推断为never类型,触发赋值错误。
下面是几种实用的解决方法:
方法1:直接使用类型断言
最简单的方式是通过类型断言告诉编译器当前test[field]的具体类型,快速绕过类型检查:
interface myType { id: number; name: string; } const formFields: (keyof myType)[] = ['id', 'name'] let test: myType= { id: 0, name: `name` } let data: string[] = ['1', 'Name'] for (let i = 0; i < data.length; i++) { const field = formFields[i]; if (typeof test[field] === 'number') { // 断言为对应字段的类型 test[field] = Number(data[i]) as myType[typeof field]; } else if (typeof test[field] === 'string') { test[field] = data[i] as myType[typeof field]; } }
方法2:用泛型函数缩小类型范围
写一个泛型函数处理单个字段的赋值,利用泛型让编译器精准推断字段对应的类型:
interface myType { id: number; name: string; } const formFields: (keyof myType)[] = ['id', 'name'] let test: myType= { id: 0, name: `name` } let data: string[] = ['1', 'Name'] // 泛型函数处理字段赋值 function assignField<T extends keyof myType>(obj: myType, field: T, value: string) { if (typeof obj[field] === 'number') { obj[field] = Number(value) as myType[T]; } else if (typeof obj[field] === 'string') { obj[field] = value as myType[T]; } } for (let i = 0; i < data.length; i++) { assignField(test, formFields[i], data[i]); }
方法3:自定义类型守卫函数
如果需要更严谨的类型检查,可以写自定义类型守卫,明确判断field的具体键值:
interface myType { id: number; name: string; } const formFields: (keyof myType)[] = ['id', 'name'] let test: myType= { id: 0, name: `name` } let data: string[] = ['1', 'Name'] // 自定义类型守卫,判断是否为number类型的字段 function isNumberField(field: keyof myType): field is 'id' { return field === 'id'; } // 自定义类型守卫,判断是否为string类型的字段 function isStringField(field: keyof myType): field is 'name' { return field === 'name'; } for (let i = 0; i < data.length; i++) { const field = formFields[i]; if (isNumberField(field)) { test[field] = Number(data[i]); } else if (isStringField(field)) { test[field] = data[i]; } }
这三种方法都能解决你的类型错误,其中类型断言适合简单场景,泛型函数和类型守卫更适合复杂或需要严格类型检查的场景。
内容的提问来源于stack exchange,提问作者ZVMAGL3
相关产品推荐
相关产品推荐

