gpt4 book ai didi

reactjs - 如何使用 typescript 为 HOC 编写通用类型?

转载 作者:搜寻专家 更新时间:2023-10-30 21:44:55 25 4
gpt4 key购买 nike

我正在为一个现有的 UI 库编写类型,它有一个接受 Element 的 Base 组件。作为字符串并执行 <Element {...props}正确的输入方式是什么?

我试过用

写一个泛型
type AllTypes = HTMLProps<HTMLDivElement> | HTMLProps<HTMLInputElement> // ... And other HTML element types
type BaseTypes <T extends AllTypes> = {
Element: string;
props: T;
className?: string;
baseClassName?: string;
}


export const BaseComponent = <T extends AllTypes>({
Element = "div",
baseClassName,
className,
...props
}: BaseTypes<T> ) => {
const classNames = [];

if (baseClassName) {
classNames.push(baseClassName);
}
if (className) {
classNames.push(className);
}



return (
<Element
className={classNames.join(' ')}
{...props }
/>
)
}

另一边

type newType = {
Element: string;
props: HTMLProps<HTMLInputElement>,
className?: string;
baseClassName?:string;
}

const InputField = (props: newType): ReactElement => {
return (
<BaseComponent<HTMLProps<HTMLInputElement>>
Element="input"
baseClassName="ff-input"
{...props}
/>
);
};

export default InputField;

我收到类似无法分配 {className:string} 的错误到 IntrinsicAttributes。

我想知道键入 BaseComponent 的正确方法,以便根据元素值确定 Prop 类型。任何建议将不胜感激。

最佳答案

你不能只使用普通字符串作为 Element与 JSX。如果你想使用一个字符串,你可以换成这样做......

React.createElement(Element, { ...props, className: classNames.join(' ') }, null);

或者,您可以将元素的类型修改为 ElementType<any> ,例如……

import * as React from 'react';
import { HTMLProps, ReactElement, ElementType } from 'react';

export type BaseProps = {
Element: ElementType<any>;
className?: string;
baseClassName?: string;
}

export const BaseComponent = <T extends {}>({
Element = "div",
baseClassName,
className,
...props
}: T & BaseProps) => {
const classNames = [];

if (baseClassName) {
classNames.push(baseClassName);
}
if (className) {
classNames.push(className);
}

return <Element { ...{...props, className: classNames.join(' ') } } />;
}

const InputField = (props: HTMLProps<HTMLInputElement>): ReactElement => {
return (
<BaseComponent<HTMLProps<HTMLInputElement>>
Element="input"
baseClassName="ff-input"
{...props}
/>
);
};

export default InputField;

关于reactjs - 如何使用 typescript 为 HOC 编写通用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57241029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com