【发布时间】:2021-05-08 23:40:20
【问题描述】:
我正在构建一个组件库,我需要其中一些组件具有可自定义的标签名称。例如,有时看起来像 <button> 的东西实际上是 <a>。所以我希望能够像这样使用按钮组件:
<Button onClick={onClick}>Click me!</Button>
<Button as="a" href="/some-url">Click me!</Button>
理想情况下,我希望根据“as”道具推断可用道具:
// Throws an error because the default value of "as" is "button",
// which doesn't accept the "href" attribute.
<Button href="/some-url">Click me!<Button>
我们可能还需要传递一个自定义组件:
// Doesn't throw an error because RouterLink has a "to" prop
<Button as={RouterLink} to="/">Click me!</Button>
这是没有 TypeScript 的实现:
function Button({ as = "button", children, ...props }) {
return React.createElement(as, props, children);
}
那么,如何在传递道具的同时使用 TypeScript 实现“as”道具?
注意:我基本上是在尝试做styled-components 所做的事情。但是我们正在使用 CSS 模块和 SCSS,所以我负担不起添加样式组件。不过,我愿意接受更简单的替代方案。
【问题讨论】:
-
这就像那里的 90%,但由于某种原因,
T extends ComponentType<any>的重载匹配了它不应该匹配的东西:tsplay.dev/rw2j1w 您也许可以从 styled-components 包中复制一些类型声明. -
谢谢,这是一个非常有趣的实现????我们将有许多与此类似的组件,因此希望我能找到一种使类型可重用的方法。我将研究样式化组件和其他库的定义。在这一点上,我也可以采用更天真的方法。
标签: javascript reactjs typescript