如何通用键入React组件道具和扩展通用道具类型

马哈里南

我有一个元素类型被参数化的组件。我想输入此组件,以便您可以指定元素的类型并将道具限制为该类型。

interface IProps<T> extends T {
  elementName: string,
}

class Foo<T> extends React.Component<IProps<T>, {}> {
  render() {
    const { elementName, ...props } = this.props;
    return React.createElement(elementName, {
        ...props,
    });
  }
}

例如,href当props的类型为时,它是一个有效的prop,AnchorHTMLAttributes而当它的类型为时则为有效HTMLAttributes

// Ok
<Foo<AnchorHTMLAttributes<AnchorHTMLElement>> href="foo.com"/>

// Type checker error because `href` is not an attribute of a div
<Foo<HTMLAttributes<HTMLDivElement>> href="foo.com"/>

这可能吗?如果可以,怎么办?

亚历克斯·韦恩

看起来您想要的类型是:

React.InputHTMLAttributes<HTMLInputElement>

将两者都换成Input其他类型的标签。

看起来最通用的约束是:

React.HTMLAttributes<HTMLElement>

然后,您可以将该类型与可以为您提供服务的内容进行合并elementName有了约束,elementName您将获得:

function Foo<T extends React.HTMLAttributes<HTMLElement>>(
  props: T & { elementName: string },
) {
  const { elementName, ...otherProps } = props
  return React.createElement(elementName, otherProps)
}

或作为类组件:

class Foo<T extends React.HTMLAttributes<HTMLElement>> extends React.Component<
  T & { elementName: string }
> {
  render() {
    const { elementName, ...otherProps } = this.props
    return React.createElement(elementName, otherProps)
  }
}

用法就像您期望的那样工作,尽管您必须提供elementName

function App() {
    return <>
        <Foo<React.InputHTMLAttributes<HTMLInputElement>>
          elementName="input"
          value={1}
        /> {/* valid */}

        <Foo<React.InputHTMLAttributes<HTMLInputElement>>
          elementName="input"
          href='/foo/bar'
        /> {/* Property 'href' does not exist on type */}
    </>
}

工作场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

React和Typescript:如何扩展通用组件道具?

来自分类Dev

React和Typescript:如何扩展通用组件道具?

来自分类Dev

通用反应组件道具

来自分类Dev

TypeScript 没有强制执行通用的交集类型(React 组件道具)

来自分类Dev

打字稿:为通用 React 组件定义未声明的道具

来自分类Dev

如何键入提供道具的高阶组件

来自分类Dev

ReactTS 通过动态组件道具扩展类型?

来自分类Dev

如果向React.FC提供通用类型,为什么需要指定道具类型?

来自分类Dev

将带有书架/通用道具的组件传递给TypeScript中的react-redux connect函数

来自分类Dev

通用扩展React组件打字稿

来自分类Dev

根据道具更改react组件的类型

来自分类Dev

如何使用样式组件中的道具类型?

来自分类Dev

通用高阶React组件产生类型错误

来自分类Dev

如何扩展接受数组通用元素的类型?

来自分类Dev

如何限制通用扩展名的类型

来自分类Dev

如何正确扩展数组的通用返回类型

来自分类Dev

如何扩展接受数组通用元素的类型?

来自分类Dev

如何为扩展简单接口的常规输出通用键入类?

来自分类Dev

扩展通用类型-PriorityQueue

来自分类Dev

扩展通用类型-PriorityQueue

来自分类Dev

如何使用道具导出React组件?

来自分类Dev

如何根据条件选择React组件道具

来自分类Dev

React-如何等待组件道具

来自分类Dev

访问React组件的道具

来自分类Dev

TypeScript和React中的联合类型道具

来自分类Dev

Typscript / React扩展默认功能组件道具时出错

来自分类Dev

如何在Typescript中将通用类型键入为接口的子集?

来自分类Dev

扩展React-FC通用Typescript组件(Ant设计选择)

来自分类Dev

我可以创建一个继承另一个道具的通用类型的道具吗?

Related 相关文章

  1. 1

    React和Typescript:如何扩展通用组件道具?

  2. 2

    React和Typescript:如何扩展通用组件道具?

  3. 3

    通用反应组件道具

  4. 4

    TypeScript 没有强制执行通用的交集类型(React 组件道具)

  5. 5

    打字稿:为通用 React 组件定义未声明的道具

  6. 6

    如何键入提供道具的高阶组件

  7. 7

    ReactTS 通过动态组件道具扩展类型?

  8. 8

    如果向React.FC提供通用类型,为什么需要指定道具类型?

  9. 9

    将带有书架/通用道具的组件传递给TypeScript中的react-redux connect函数

  10. 10

    通用扩展React组件打字稿

  11. 11

    根据道具更改react组件的类型

  12. 12

    如何使用样式组件中的道具类型?

  13. 13

    通用高阶React组件产生类型错误

  14. 14

    如何扩展接受数组通用元素的类型?

  15. 15

    如何限制通用扩展名的类型

  16. 16

    如何正确扩展数组的通用返回类型

  17. 17

    如何扩展接受数组通用元素的类型?

  18. 18

    如何为扩展简单接口的常规输出通用键入类?

  19. 19

    扩展通用类型-PriorityQueue

  20. 20

    扩展通用类型-PriorityQueue

  21. 21

    如何使用道具导出React组件?

  22. 22

    如何根据条件选择React组件道具

  23. 23

    React-如何等待组件道具

  24. 24

    访问React组件的道具

  25. 25

    TypeScript和React中的联合类型道具

  26. 26

    Typscript / React扩展默认功能组件道具时出错

  27. 27

    如何在Typescript中将通用类型键入为接口的子集?

  28. 28

    扩展React-FC通用Typescript组件(Ant设计选择)

  29. 29

    我可以创建一个继承另一个道具的通用类型的道具吗?

热门标签

归档