TypeScript从axios切换至fetch时出现类型报错如何解决
Axios迁移Fetch时返回值类型校验报错解决方案
错误原因
node-fetch内置类型定义中,response.json()方法的默认返回值为Promise<unknown>,TypeScript 禁止直接从unknown类型上读取、解构属性,因此抛出Property 'library' does not exist on type 'unknown'错误。- 原有Axios实现默认将响应数据类型设置为
any,绕过了严格类型校验,因此不会触发同类错误。 - 你提供的Fetch实现代码中还存在一处语法问题:
const baseURL: SERVER_INFO.URL;是类型标注语法而非赋值,运行时baseURL值为undefined,需要修正为赋值写法。
修复方案
方案1(推荐,保留完整类型校验)
先定义接口返回结构的类型,再对JSON解析结果做类型断言,既解决报错又保留TypeScript的类型检查能力:
import fetch, { RequestInit } from "node-fetch"; // 定义接口返回结构类型,library字段收窄为实际可能的枚举值更安全 interface ApiResponse { library: "access" | "no-access"; name: { first: string; }; } private async getAccessType(): Promise<string> { // 修正baseURL赋值错误 const baseURL = SERVER_INFO.URL; const config: RequestInit = { method: "get", headers: { Authorization: this.token, "X-Api-key": SERVER.KEY } }; const response = await fetch(`${baseURL}/getData`, config); // 对解析后的JSON结果做类型断言 const { library } = await response.json() as ApiResponse; return library; }
方案2(快速修复,不推荐)
如果不需要严格类型校验,可以直接将解析结果断言为any跳过检查,但会丢失类型安全能力:
const response = await fetch(`${baseURL}/getData`, config); const { library } = await response.json() as any; return library;
注意:Fetch本身没有Axios自带的
baseURL、请求/响应拦截器、自动JSON解析等封装能力,迁移时除了类型问题,还需要额外处理HTTP错误状态(Fetch只有网络错误才会reject,4xx/5xx状态码需要手动通过response.ok判断)。
内容的提问来源于stack exchange,提问作者sal3jfc
相关产品推荐
相关产品推荐

