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

为Axios请求NewsAPI响应定义TypeScript类型时遇错误

解决NewsAPI + Axios + TypeScript类型问题

1. 修正TypeScript类型定义

你的类型定义存在两个核心问题:

  • articles: [{...}] 定义的是仅含单个元素的数组,正确的数组类型应该写成Article[]
  • NewsAPI返回的部分字段(比如source.id、author、description等)可能为null或不存在,必须添加可选符?

修正后的类型定义:

// 拆分Article类型,提升代码可读性
export type Article = {
  source: {
    id?: string; // 可选字段,可能为null
    name: string;
  };
  author?: string; // 可选字段
  title: string;
  description?: string; // 可选字段
  url: string;
  urlToImage?: string; // 可选字段
  publishedAt: string;
  content?: string; // 可选字段
};

export type AllNews = {
  status: string;
  totalResults: number;
  articles: Article[]; // 正确的数组类型声明
};

2. 修正Axios请求与状态逻辑

业务代码里有几个关键错误需要修复:

  • Axios的响应数据存在res.data中,不是res.articles
  • useEffect内部未调用getTopNews函数
  • useEffect缺少依赖数组,会触发无限循环
  • 状态类型与赋值内容不匹配,需根据需求调整

方案1:存储完整响应数据

import axios from "axios"
import { AllNews, Article } from "../../types/AllNews"
import { useState, useEffect } from "react";

export const Top = () => {
  // 存储完整的AllNews类型数据,初始值设为null
  const [news, setNews] = useState<AllNews | null>(null);

  useEffect(() => {
    const getTopNews = async () => {
      try {
        // Axios泛型参数自动推断res.data的类型为AllNews
        const res = await axios.get<AllNews>('https://newsapi.org/v2/top-headlines?country=us&apiKey=xxxxxx');
        // 传入完整的响应数据
        setNews(res.data);
      } catch (err) {
        console.error('获取新闻失败:', err);
      }
    };

    getTopNews();
  }, []); // 空依赖数组,仅组件挂载时执行一次

  return (
    <div>
      {news?.articles.map((article) => (
        <div key={article.url}>
          <h3>{article.title}</h3>
        </div>
      ))}
    </div>
  );
};

方案2:仅存储文章列表

如果只需要文章数据,可以直接将状态类型设为Article[]:

import axios from "axios"
import { AllNews, Article } from "../../types/AllNews"
import { useState, useEffect } from "react";

export const Top = () => {
  // 仅存储文章数组,初始值设为空数组
  const [articles, setArticles] = useState<Article[]>([]);

  useEffect(() => {
    const getTopNews = async () => {
      try {
        const res = await axios.get<AllNews>('https://newsapi.org/v2/top-headlines?country=us&apiKey=xxxxxx');
        // 直接提取articles数组赋值
        setArticles(res.data.articles);
      } catch (err) {
        console.error('获取新闻失败:', err);
      }
    };

    getTopNews();
  }, []);

  return (
    <div>
      {articles.map((article) => (
        <div key={article.url}>
          <h3>{article.title}</h3>
        </div>
      ))}
    </div>
  );
};

关键注意点

  • Axios默认响应类型为JSON,完全匹配NewsAPI的返回格式,无需额外设置响应类型
  • 必须添加错误捕获,避免请求失败导致页面崩溃
  • 使用可选链?.处理可能为null的状态,防止渲染时出现类型错误

内容的提问来源于stack exchange,提问作者Beginner Professional

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:54:17