我正在为一个现有的 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/