使用SWR做类型安全数据请求时any类型的替代方案是什么
这个告警触发的原因是泛型默认值使用了显式any,违反了@typescript-eslint/no-explicit-any规则,优先推荐将any替换为unknown,具体可根据你的使用场景选择以下方案:
方案1:泛型默认值改为unknown(最推荐,符合类型安全要求)
通用fetcher作为公共工具函数,本身无法预判所有返回数据的结构,将默认泛型设为unknown可以强制你在调用useSWR时显式声明对应接口的返回类型,从根源避免隐式any带来的类型安全隐患。修改后代码如下:
export default async function fetcher<JSON = unknown>( input: RequestInfo, init?: RequestInit ): Promise<JSON> { const res = await fetch(input, init) return res.json() as JSON }
使用时直接给useSWR传入对应返回类型即可获得完整类型提示:
// 示例:请求用户信息接口,预先定义返回类型为User interface User { id: number name: string email: string } const { data } = useSWR<User>('/api/user', fetcher)
方案2:固定为自定义返回类型(仅适用于非通用场景)
如果你的fetcher只用来请求特定业务域的接口,返回结构完全固定,可以直接将泛型替换为你预先定义的业务类型,不需要设置泛型默认值:
// 示例:自定义业务接口通用返回结构 interface BizResponse<T = unknown> { code: number data: T message: string } export default async function fetcher<T = unknown>( input: RequestInfo, init?: RequestInit ): Promise<BizResponse<T>> { const res = await fetch(input, init) return res.json() }
使用时只需传入业务数据的类型即可:
const { data } = useSWR<BizResponse<User>>('/api/user', fetcher)
方案3:临时禁用规则(不推荐,仅用于兼容旧代码)
如果暂时不想调整类型逻辑,可以在告警行加单行注释关闭当前行的eslint校验:
// eslint-disable-next-line @typescript-eslint/no-explicit-any export default async function fetcher<JSON = any>( input: RequestInfo, init?: RequestInit ): Promise<JSON> { const res = await fetch(input, init) return res.json() }
内容的提问来源于stack exchange,提问作者P4nd4b0b3r1n0
相关产品推荐
相关产品推荐

