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

React组件使用ref报错:传递type等props存在类型不兼容问题

解决React forwardRef组件传递Props类型报错问题

这个报错是因为TypeScript无法识别你传递给MyInput的type、placeholder等属性——你没有给组件定义合法的Props类型,导致TS认为这些属性不在组件的接收范围内。

解决方案:给组件添加正确的类型定义

因为你的组件是封装原生input,最简单的方式是复用原生input的属性类型,同时明确forwardRef的泛型参数:

修改MyInput.tsx(如果是jsx文件,建议改为tsx以获得更好的类型支持):

import React, { forwardRef } from 'react'
import classes from './MyInput.module.css'

// 复用原生input的所有属性类型
type MyInputProps = React.InputHTMLAttributes<HTMLInputElement>

// forwardRef泛型参数:第一个是ref绑定的DOM元素类型,第二个是组件接收的Props类型
const MyInput = forwardRef<HTMLInputElement, MyInputProps>((props, ref) => {
    return (
        <input ref={ref} className={classes.myInput} {...props} />
    );
});

export default MyInput;

自定义Props类型(可选)

如果你只想让组件接收特定属性,可以自定义类型并合并原生input的通用属性:

import React, { forwardRef } from 'react'
import classes from './MyInput.module.css'

// 自定义需要的属性,再合并input的通用属性
type MyInputProps = {
    type: string;
    placeholder: string;
    // 可添加其他自定义属性
} & React.InputHTMLAttributes<HTMLInputElement>

const MyInput = forwardRef<HTMLInputElement, MyInputProps>((props, ref) => {
    return (
        <input ref={ref} className={classes.myInput} {...props} />
    );
});

export default MyInput;

纯JSX文件的处理方式(不推荐)

如果不想转TSX,可以用JSDoc注释给组件添加类型提示:

import React, { forwardRef } from 'react'
import classes from './MyInput.module.css'

/**
 * @typedef {Object} MyInputProps
 * @property {string} type
 * @property {string} placeholder
 * @property {import('react').InputHTMLAttributes<HTMLInputElement>} [rest]
 */

/**
 * @param {MyInputProps} props
 * @param {import('react').Ref<HTMLInputElement>} ref
 */
const MyInput = forwardRef((props, ref) => {
    return (
        <input ref={ref} className={classes.myInput} {...props} />
    );
});

export default MyInput;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:30:50