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

React TypeScript组件传参错误:函数误传为数组类型

问题分析与解决

错误根源

组件Props中定义的students是数组类型(Array<Student['id']>等价于string[]),但你传入的是异步函数getStudents——函数类型和数组类型完全不兼容,TypeScript检测到类型不匹配,所以提示函数缺少数组特有的pop、push等方法(它期望接收数组,实际收到了函数)。

两种修正方案

方案1:组件接收数组,父组件先获取数据再传入

如果组件的职责是展示学生ID数组,那么保持Props的数组定义不变,在父组件中调用异步函数拿到数组后再传递:

// 组件定义
interface Student {
  id: string;
}

interface MyComponentProps {
  students: Array<Student['id']>;
}

const MyComponent = ({ students }: MyComponentProps) => {
  return <div>学生ID列表:{students.join(', ')}</div>;
};

// 父组件中调用函数并传递数组
import { useState, useEffect } from 'react';

const getStudents = async (): Promise<string[]> => {
  // 模拟接口请求获取学生ID
  return await Promise.resolve(['stu_001', 'stu_002']);
};

const ParentComponent = () => {
  const [studentIds, setStudentIds] = useState<string[]>([]);

  useEffect(() => {
    const fetchData = async () => {
      const ids = await getStudents();
      setStudentIds(ids);
    };
    fetchData();
  }, []);

  return <MyComponent students={studentIds} />;
};

方案2:修改组件Props,直接接收异步函数

如果组件需要自己触发数据获取,可以把Props的类型改成接收异步函数:

// 修改组件Props定义
interface MyComponentProps {
  getStudents: () => Promise<string[]>;
}

const MyComponent = ({ getStudents }: MyComponentProps) => {
  const [studentIds, setStudentIds] = useState<string[]>([]);

  useEffect(() => {
    const fetchData = async () => {
      const ids = await getStudents();
      setStudentIds(ids);
    };
    fetchData();
  }, [getStudents]);

  return <div>学生ID列表:{studentIds.join(', ')}</div>;
};

// 调用时直接传入函数
<MyComponent getStudents={getStudents} />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:35:23