reactjs 通过props传递的组件的React和TypeScript用法

j8ag8udp  于 2023-04-20  发布在  React
关注(0)|答案(2)|浏览(138)

我有一个Sidebar组件,它通过props将唯一的图标传递给SidebarRow子组件。

import SidebarRow from './SidebarRow';
import {
    CogIcon,
    UsersIcon
} from '@heroicons/react/solid';

const Sidebar: React.FC = () => {
    return (
        <div className="p-2 mt-5 max-w-5xl xl:min-w-lg">
            <SidebarRow src="" title="Tom Mc" />
            <SidebarRow Icon={UsersIcon} title="Friends" />
            <SidebarRow Icon={CogIcon} title="Account" />
        </div>    
    )
}

export default Sidebar;

SidebarRow组件中,一个接口定义了传入的props。这里我试图有条件地渲染一个图像或一个Icon,这取决于传入的是哪一个。

import React from "react";

interface SidebarRowProps {
    src?: string
    Icon?: React.FC
    title: string
};

const SidebarRow: React.FC<SidebarRowProps> = ({ src, Icon, title }) => {
    return (
        <div className="">
            {src && (
                <img className="rounded-full" src={src} alt="" width="30" height="30" />            
            )}
            {Icon && (
                <Icon className="h-8 w-8 text-blue-500" />
            )}
            <p className="hidden sm:inline-flex font-medium">{title}</p>
        </div>    
    )
};

export default SidebarRow;

我收到以下关于Icon组件上的className属性的错误:

Type '{ className: string; }' is not assignable to type 'IntrinsicAttributes & { children?: ReactNode; }'.
  Property 'className' does not exist on type 'IntrinsicAttributes & { children?: ReactNode; }'.ts(2322)
(JSX attribute) className: string

如何定义Icon类型以使className属性不抛出此错误?
谢谢大家!

agxfikkp

agxfikkp1#

下面的代码工作正常

import React from "react";

interface SidebarRowProps {
    src?: string
    Icon?: React.ComponentType<React.SVGProps<SVGSVGElement>>
    title: string
};
2mbi3lxu

2mbi3lxu2#

英雄图标的类型在2.0.17中改变了。根据regarding the icons type signature #981,正确的图标类型现在是

type Icon = React.FC<Parameters<typeof UsersIcon>[0]>

type IconSVGProps = React.PropsWithoutRef<React.SVGProps<SVGSVGElement>> & React.RefAttributes<SVGSVGElement>
type IconProps = IconSVGProps & {
      title?: string
      titleId?: string
 }

 type Icon = React.FC<IconProps>

相关问题