ReactNative中useSWR optimisticData特性的TypeScript错误排查
解决思路
错误核心原因
TypeScript报错的本质是:useSWR的mutate方法要求,当第一个参数为Promise类型时,必须返回IUser | undefined类型;但你调用的userUpdate接口返回的是Promise<void>,类型不匹配导致类型检查失败。
具体解决方法
方法一:包装更新函数,返回最新用户数据
既然userUpdate不返回用户数据,我们可以在更新完成后重新调用userGet获取最新数据,让返回的Promise类型符合mutate的要求:const handleUpdateName = async (value: string) => { const updateAndFetch = async () => { await apiClient.user.userUpdate({ userUpdateRequest: { name: value } }); return apiClient.user.userGet(); // 返回IUser类型的Promise }; mutate(updateAndFetch(), { optimisticData: { ...data, name: value }, populateCache: false, }); };优点:保证缓存数据和后端完全一致;缺点:多一次网络请求。
方法二:使用mutate的回调函数形式
mutate支持传入回调函数,该函数接收当前缓存数据,处理异步更新后返回新的缓存数据,无需额外请求:const handleUpdateName = (value: string) => { mutate(async (currentData) => { await apiClient.user.userUpdate({ userUpdateRequest: { name: value } }); // 返回更新后的用户数据,类型符合IUser | undefined return currentData ? { ...currentData, name: value } : undefined; }, { optimisticData: { ...data, name: value }, populateCache: false, }); };优点:无需额外请求,性能更好;缺点:依赖前端更新逻辑的正确性,若后端对数据有额外处理(比如自动修正格式),缓存会和后端不一致。
方法三:类型断言(应急方案,不推荐)
直接通过类型断言绕过TypeScript检查,但会丢失类型安全性,仅适合临时应急:mutate( apiClient.user.userUpdate({ userUpdateRequest: { name: value } }) as unknown as Promise<IUser | undefined>, { optimisticData: { ...data, name: value }, populateCache: false, } );注意:如果后续
userUpdate的返回类型发生变化,这种方式会隐藏潜在错误。
内容的提问来源于stack exchange,提问作者checklist
相关产品推荐
相关产品推荐

