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

React TS报错:FormField无法作为JSX组件,返回类型void无效

解决TypeScript错误:'FormField' cannot be used as a JSX component

你创建了FormField组件以简化代码、避免冗余,并将其导入到登录表单login.tsx中,但出现TypeScript错误:

'FormField' cannot be used as a JSX component. Its return type 'void' is not a valid JSX element.ts(2786)

相关代码如下:

login.tsx

import { Layout } from "~/components/layout";
import { FormField } from "~/components/form-field";
import { useState } from "react";

export default function Login() {
  const [formData, setFormData] = useState({
    email: "",
    password: "",
  });

  // 输入变化时更新表单数据
  const handleInputChange = (
    event: React.ChangeEvent<HTMLInputElement>,
    field: string
  ) =>
    setFormData((form) => ({
      ...form,
      [field]: event.target.value,
    }));

  return (
    <Layout>
      <div className="h-full flex justify-center items-center flex-col gap-y-4">
        <form className="rounded-2xl bg-gray-200 p-6 w-96">
          <FormField
            htmlFor="email"
            label="Email"
            value={formData.email}
            onChange={(e) => handleInputChange(e, "email")}
          />
        </form>
      </div>
    </Layout>
  );
}

form-field.tsx

import { useState, useEffect } from 'react'
interface FormFieldProps {
    htmlFor: string,
    label: string,
    type?: string,
    value: any,
    onChange?: (...args: any) => any,
    error?: string
}

export function FormField({
    htmlFor,
    label,
    type = "text",
    value,
    onChange = () => { },
    error = ""

}: FormFieldProps) {
    const [errorText, setErrorText] = useState(error)

    useEffect(() => {
        setErrorText(error)
    }, [error])

    return
    <>
        <label htmlFor={htmlFor} className="text-blue-600 font-semibold">{label}</label>
        <input onChange={e => {
            onChange(e)
            setErrorText('')
        }} type={type} id={htmlFor} name={htmlFor} className="w-full p-2 rounded-xl my-2" value={value} />
        <div className="text-xs font-semibold text-center tracking-wide text-red-500 w-full">
            {errorText || ''}
        </div>
    </>
}

问题原因

JavaScript的**自动分号插入(ASI)**机制会在单独成行的return语句后自动添加分号,导致函数提前返回undefined(TypeScript将其识别为void类型),没有返回有效的JSX元素。

解决方法

将return与JSX片段放在同一行,或者用括号包裹JSX内容(推荐后者,彻底避免ASI问题):

修正后的form-field.tsx核心代码:

export function FormField({
    htmlFor,
    label,
    type = "text",
    value,
    onChange = () => { },
    error = ""

}: FormFieldProps) {
    const [errorText, setErrorText] = useState(error)

    useEffect(() => {
        setErrorText(error)
    }, [error])

    // 用括号包裹JSX,避免自动分号插入
    return (
        <>
            <label htmlFor={htmlFor} className="text-blue-600 font-semibold">{label}</label>
            <input onChange={e => {
                onChange(e)
                setErrorText('')
            }} type={type} id={htmlFor} name={htmlFor} className="w-full p-2 rounded-xl my-2" value={value} />
            <div className="text-xs font-semibold text-center tracking-wide text-red-500 w-full">
                {errorText || ''}
            </div>
        </>
    )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:37:25