首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >样式组件+类型记录:"as“不能分配到键入IntrinsicAttributes

样式组件+类型记录:"as“不能分配到键入IntrinsicAttributes
EN

Stack Overflow用户
提问于 2021-01-15 16:53:18
回答 2查看 4.2K关注 0票数 6

我有一个单一的,其中包含一个设计系统与样式的组成部分。在这个设计系统中,我有一个标题组件,它需要一个“级别”支柱来调整标题的CSS。

航向

代码语言:javascript
复制
export interface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {
    level: 'colossus' | 'uber' | 'hero' | '1' | '2' | '3' | '4' | '5'
}

export const Heading: React.FC<HeadingProps> = ({ level = '1', children, ...rest }) => {
    return (
        <HeadingStyled level={level} {...rest}>
            {children}
        </HeadingStyled>
    )
}

使用

要使用这个标题组件,我只需将一个level传递给它,用于样式和as支柱,以调整所呈现的内容。

代码语言:javascript
复制
<Heading as="h2" level="2">
    Header 2
</Heading>

问题

当我使用这个组件时,我会在as支柱上得到一个类型记录错误

代码语言:javascript
复制
Type '{ children: string; as: string; level: "2"; }' is not assignable to type 'IntrinsicAttributes & HeadingProps & { children?: ReactNode; }'.

Property 'as' does not exist on type 'IntrinsicAttributes & HeadingProps & { children?: ReactNode; }'.

我试过:

代码语言:javascript
复制
export interface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {
    level: 'colossus' | 'uber' | 'hero' | '1' | '2' | '3' | '4' | '5'
    as?: React.Element | JSX.Element | JSX.IntrinsicElements
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-21 12:10:00

您已经接近了!JSX.IntrinsicElements是一个接口,它的键是HTML的标签。它本身并不是所有HTML标记的联合。

这意味着你要做的就是

代码语言:javascript
复制
interface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {
    // ...
    as?: keyof JSX.IntrinsicElements // Note the keyof!
}

现在TS将as的签名显示为:

代码语言:javascript
复制
(JSX attribute) HeadingProps.as?: "symbol" | "object" | "a" | "abbr" | "address" | "area" | "article" | "aside" | "audio" | "b" | "base" | "bdi" | "bdo" | "big" | "blockquote" | "body" | "br" | "button" | "canvas" | ... 156 more ... | undefined

这意味着您的代码现在将完全按照预期工作。

代码语言:javascript
复制
<Heading as="h2" level="2"> // No TS errors! ✅
    Header 2
</Heading>

TS游乐场链接

票数 7
EN

Stack Overflow用户

发布于 2022-07-06 23:11:27

在完成@Aron答案的过程中,这段代码为我工作(styled-component + styled-system)

代码语言:javascript
复制
{ as?: ComponentType<any> | keyof JSX.IntrinsicElements | string | undefined }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65740233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档