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

React传递数组props时触发prop-types校验length缺失报错

报错根因

这个报错本质是两个写法问题导致的:

  • 你给传入的数组属性起名为props,和React组件默认接收的顶层props对象重名,ESLint的prop-types校验规则会把props.length识别为「访问props下名为length的属性」,而不是你传入的数组自带的length属性。
  • PropTypes和defaultProps类型不匹配:你声明传入的props是字符串数组,默认值却给了空字符串'',类型校验本身就不通过。
修复方案

优先推荐第一种写法,从根源上避免命名混淆:

方案1:修改传入属性名(推荐)

不要用props作为自定义传参的属性名,改成语义化的名称,比如emailList:

  1. 修改组件调用代码:
const eusers = ['Euser1@gmail.com', 'Euser2@yahoo.com'] 
<EnableUser emailList={eusers} />
  1. 修改组件定义和校验规则:
import PropTypes from 'prop-types';
import { useState } from 'react';

export default function EnableUser({ emailList }) {
  // 此时访问数组length不会触发ESLint报错
  const [emailCount, setEmailCount] = useState(emailList.length);

  // 其余组件逻辑
}

EnableUser.propTypes = {
  emailList: PropTypes.arrayOf(PropTypes.string),
}

EnableUser.defaultProps = {
  emailList: [], // 数组类型的默认值给空数组,和声明类型匹配
}

方案2:保留props作为属性名(不推荐)

如果一定要用props作为传入的属性名,修正PropTypes和默认值即可:

import PropTypes from 'prop-types';
import { useState } from 'react';

export default function EnableUser({ props }) {
  const [emailCount, setEmailCount] = useState(props.length);
  // 其余组件逻辑
}

EnableUser.propTypes = {
  props: PropTypes.arrayOf(PropTypes.string),
}

EnableUser.defaultProps = {
  props: [], // 替换原来的空字符串默认值
}

这种写法非常容易和React组件自带的顶层props对象混淆,后续维护很容易出问题,非必要不要用。

如果改完代码还是报错,直接重启编辑器的ESLint服务即可,ESLint不会实时加载PropTypes的修改,重启后校验规则就会正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:45:15