You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:21:19