循环重置对象至初始值时遇TypeScript类型错误求助
原因分析
TypeScript 在循环处理索引键时,会做索引访问类型的宽化:当你用联合类型的键("todos" | "user")去索引 mockData 时,它无法推断当前循环的 key 对应具体哪个值类型,只能默认认为这个赋值要同时满足所有键的类型要求,因此把 mockData[key] 的类型推断为所有值类型的交集 Todo[] & User,而你实际赋值的是 Todo[] | User,两者自然不兼容。
解决方案
1. 类型断言缩小范围
在赋值时明确告诉 TypeScript 当前键对应的值类型匹配:
export const mockData = { ...initialState, reset: () => { keysOf(initialState).forEach((key) => { (mockData[key] as typeof initialState[typeof key]) = cloneDeep(initialState[key]); }); }, };
2. 提取泛型函数追踪类型
把赋值逻辑封装成泛型函数,让 TypeScript 能追踪每个键的具体类型:
function resetKey<K extends keyof typeof initialState>(key: K) { mockData[key] = cloneDeep(initialState[key]); } export const mockData = { ...initialState, reset: () => { keysOf(initialState).forEach(resetKey); }, };
3. 显式声明对象类型
直接定义 mockData 的类型结构,再用类型断言绕过循环里的宽化问题:
type MockData = typeof initialState & { reset: () => void }; export const mockData: MockData = { ...initialState, reset: () => { keysOf(initialState).forEach((key) => { (mockData as any)[key] = cloneDeep(initialState[key]); }); }, };
内容的提问来源于stack exchange,提问作者Marcelo
相关产品推荐
相关产品推荐

