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

标签 reactjs typescript typescript-generics

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

相关文章:

angular - 使用 md-slider 选择范围

typescript - 你能为 TypeScript 泛型指定多个类型约束吗

javascript - 使用react-select将值传递给状态

reactjs - React-i18next 每个组件的翻译

javascript - 如何正确使用 @mdx-js/loader 和 create-react-app?

typescript - 如何根据输入参数键入返回类型

typescript :带枚举的通用函数

javascript - 如何在 React JSX 中调用 Web API?

javascript - 编写需要 Promise 但如果不满足条件则什么也不能返回的 typescript 方法的正确方法是什么?

angular - Firebase 5.8^ sendEmailVerification