如何在React中使用TypeScript输入动态标签?给定此代码:
interface CompProps {
tag: string;
}
const MyComponent: React.FunctionComponent<CompProps> = ({
tag = "div",
children
}) => {
const Wrapper = tag;
return <Wrapper>{children}</Wrapper>;
};
我得到这个错误:
类型“{ children:“ReactNode; }”与类型“IntrinsicAttributes”没有共同属性。中文(简体)
在我看来,我必须添加适当的类型,但我不能弄清楚是哪个。
6条答案
按热度按时间g52tjvyc1#
您可以传入一个
string
作为标记名并使用它,但是您需要正确地键入它以进行类型检查。tag
应该是JSX.IntrinsicElements
的键。Playground链接
ippsafx72#
所有HTML元素使用类型定义
为了允许所有HTML元素都用作标记,您可以利用在
JSX
命名空间中定义的IntrinsicElements
接口的键。IntrinsicElements
似乎包含HTML元素标记到其各自属性的Map(包括元素特定属性)。要使用这些密钥,我们可以执行以下操作:如果我想允许React组件作为标签,该怎么办?
React定义了两个接口:
ComponentClass
和FunctionComponent
。React还定义了这两个接口的联合,允许您指定任何React组件:ComponentType
。我们可以创建一个这个和我们最后一个定义的联合,以允许组件和HTML标记。好了,现在我有了标签,那么HTML属性呢?
如果您希望允许所有其他HTML属性,您可以扩展
React.HTMLAttributes<Element>
以获取所有共享的HTML属性(没有特定于元素的属性),或者您可以引入一个泛型并使用JSX.IntrinsicElements
。第二种选择更为复杂,并带有一些警告。**您必须使用
type
而不是interface
**来扩展/交叉您的Props
和JSX.IntrinsicElements
中的键上定义的特定属性。你还需要在你的函数上使用泛型,这样你就可以将它们传递给你的Props
类型,这意味着你不能再使用React.FunctionComponent<Props>
,因为这发生在访问任何泛型之前。这意味着您需要将children
添加到Props
定义中。这是一个很大的问题,我认为用这个例子可以更好地解释:
f4t66c6m3#
我有一个类似的问题,我试图生成一个动态的标题标记的基础上通过'水平' prop 。它还生成了**“属性X在类型IntrinsicAttributes上不存在”**错误。
生成错误的代码如下:
我通过改变来解决这个问题:
致:
wfveoks04#
这对我来说很好。
m2xkgtsf5#
使用TypeScript在React中使用动态标签名的简单方法:
vfwfrxfs6#
我在这里看不到任何完全正确的答案。所有的答案都不会根据所使用的标签改变 prop 。
下面是我在工作中使用的组件类型的简化版本,它基于其标记更改 prop ,包括默认标记。如果您将错误的props放到所使用的标记中,例如尝试将
formAction
prop放到div
标记中,也会出现错误。让我知道如果错过了什么,或者如果有一个改进,我可以做。