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

如何为useState的user设置正确类型,避免提取JSON数据时的类型错误?

解决TypeScript报错:Property 'bio' does not exist on type 'any[]'

报错根源

你代码里的核心问题是useState的初始值与实际数据类型不匹配:

  • 给useState传了初始值[](空数组),TypeScript自动推断user的类型为any[](任意类型的数组)。
  • 但GitHub API返回的是单个用户对象,不是数组,所以用.访问user.bio时,TS会报错——数组类型根本没有bio属性。
  • user['bio']能绕过报错,是因为TS对数组的字符串索引访问规则更宽松,但这只是规避问题,不是正确解法。

正确解决步骤

1. 定义用户数据类型接口

先明确GitHub返回的用户结构,定义TypeScript接口,包含你需要用到的属性:

interface GithubUser {
  bio?: string; // 加?是因为部分用户可能没有bio字段
  // 按需添加其他属性,比如name: string; avatar_url: string; 等
}

2. 修正useState的初始值与类型

把初始值从空数组改成null,同时手动指定user的类型为GithubUser | null(表示要么是用户对象,要么是未加载的空状态):

const [user, setUser] = useState<GithubUser | null>(null);

为什么不用数组?因为你请求的是单个用户,不是用户列表,数组类型完全不符合实际数据结构。

3. 渲染时做空值安全检查

在访问user.bio之前,确保user已经被正确赋值(避免组件初始化时user为null导致JS报错),可以用可选链操作符?.:

return (
  <div>
    {user?.bio || "该用户没有个人简介"}
  </div>
);

修改后的完整代码

'use client';
import { useEffect, useState } from "react";

// 定义用户数据接口
interface GithubUser {
  bio?: string;
  // 按需添加其他属性,比如name: string; avatar_url: string; 等
}

export default function Github(){
    // 修正useState的类型和初始值
    const [user , setUser] = useState<GithubUser | null>(null);
    
    const fetchUserData = () => {
        fetch("https://api.github.com/users/userName")
        .then(response => response.json())
        .then(data => {
            setUser(data as GithubUser); // 断言数据符合定义的接口类型
        })
        .catch(err => console.error("请求失败:", err)); // 建议添加错误捕获
    }

    useEffect( () => {
        fetchUserData();
    }, [])

    return (
        <div>
            {/* 空值安全访问 */}
            {user?.bio || "该用户没有个人简介"}
        </div>
    )
}

你之前尝试声明接口但没解决的可能原因

  • 没有给useState手动指定类型,TS还是会根据初始值[]推断为数组类型,忽略你定义的接口。
  • 初始值仍然是数组,即使指定了接口类型,TS会因为类型冲突报错,或者优先采用数组的推断类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:07:35