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

React+TypeScript从API加载数据时出现TS2339类型错误

解决TS2339: Property 'xxx' does not exist on type '[]'错误

问题根源是你给map回调里的language指定了错误的类型[]——TypeScript将其识别为空数组,自然找不到languageId和name这类对象属性。以下是具体修复方案:

1. 定义数据结构的TypeScript接口

先明确后端返回的语言对象结构,创建对应的接口:

// 单个语言对象的结构
interface Language {
  languageId: number; // 根据实际数据类型调整,比如字符串就写string
  name: string;
}

// 查询返回的整体数据结构
interface LanguagesData {
  languages: Language[];
}

2. 给useQuery指定泛型

让Apollo Client正确推断返回数据的类型:

const { loading, error, data } = useQuery<LanguagesData>(GET_LANGUAGES_QUERY);

3. 修正map回调的类型标注

把错误的[]替换为我们定义的Language接口,也可以直接省略类型(TypeScript会自动推断):

{data.languages.map((language: Language) => (
  <li key={language.languageId}>
    {language.languageId} - {language.name}
  </li>
))}

完整修复后的代码

import React from 'react';
import { gql, useQuery } from '@apollo/client';

// 定义数据结构接口
interface Language {
  languageId: number;
  name: string;
}

interface LanguagesData {
  languages: Language[];
}

const GET_LANGUAGES_QUERY = gql`
  query Query {
    languages {
      languageId
      name
    }
  }
`;

export const LanguagesPage: React.FC = () => {
  // 指定泛型让TypeScript识别数据类型
  const { loading, error, data } = useQuery<LanguagesData>(GET_LANGUAGES_QUERY);

  if (error) return <p>获取数据出错</p>;
  if (loading) return <p>加载中</p>;
  console.log(data);

  return (
    <main>
      <div>当前语言: Tabla</div>
      <h3>你想学习哪种语言?</h3>
      <ul>
        {data.languages.map((language) => (
          <li key={language.languageId}>
            {language.languageId} - {language.name}
          </li>
        ))}
      </ul>
    </main>
  );
};

注:原代码中存在<ul>标签缺失开头的问题,修复后的代码已补上。

内容的提问来源于stack exchange,提问作者Seraphits Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:01:19