【发布时间】:2021-05-19 06:15:00
【问题描述】:
我正在尝试制作可重复使用的样式组件卡片。我在我的 React 应用程序中使用了 typescript。我让孩子们输入children?: string | JSX.Element。但是在我的卡片容器中,它没有定义并给出打字稿错误:Types of property 'children' are incompatible.,即使我做了children optional。我真的不明白什么是主要错误以及如何解决它。
我在code-sandbox 中分享我的代码。
**Ps: It does not thorw errors in codesandbox**
这是我的卡片组件
import React from "react";
import styled from "styled-components";
export interface ICardProps {
title?: string;
secondaryText?: string;
hoverable?: boolean;
thumbnailUrl?: string;
coverImage?: string;
url?: string;
children?: string | JSX.Element;
}
const Container = styled.div<ICardProps>`
box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2),
0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px;
border-radius: 6px;
background: white;
margin-bottom: 20px;
&:hover {
${({ hoverable }) =>
hoverable
? `box-shadow: 0 0 20px rgba(0, 0, 0, 0.05), 0 0px 60px rgba(0, 0, 0, 0.08)`
: null}
}
`;
const Title = styled.h1`
margin: 0;
font-size: 24px;
`;
const SecondaryText = styled.p`
margin: 0;
color: #6b6b6b;
`;
const Thumbnail = styled.div<ICardProps>`
width: 70px;
height: 70px;
border-radius: 50%;
background-image: url(${({ url }) => url});
background-size: cover;
margin-right: 10px;
`;
const TitleBar = styled.div`
display: flex;
align-items: center;
`;
const CoverImage = styled.img`
width: 100%;
border-radius: 6px 6px 0 0;
`;
const Content = styled.div`
padding: 20px;
`;
const ChildrenContent = styled.div`
background: pink;
`;
const Card = ({
title,
secondaryText,
thumbnailUrl,
coverImage,
children,
hoverable,
...props
}: ICardProps) => {
return (
<Container
{...props}
{...{ hoverable, title, secondaryText, thumbnailUrl, coverImage, ...props }}>
{coverImage ? <CoverImage src={coverImage} /> : null}
<Content>
<TitleBar>
{thumbnailUrl ? <Thumbnail url={thumbnailUrl} /> : null}
<div>
{title ? <Title>{title}</Title> : null}
{secondaryText ? <SecondaryText>{secondaryText}</SecondaryText> : null}
</div>
</TitleBar>
{typeof children === `string` ?
<ChildrenContent> {children}</ChildrenContent> :
children
}
</Content>
</Container>
)
};
export default Card;
这就是我尝试使用它的方式
import React from "react";
import styled from "styled-components/macro";
import { Card } from "./lib/Card";
const ThinnerCard = styled(Card)`
width: 400px;
`;
export default function App() {
return (
<div>
<ThinnerCard
coverImage="http://www.fillmurray.com/500/300"
thumbnailUrl="http://www.fillmurray.com/100/100"
title="This is the title"
secondaryText="Secondary title"
/>
<Card title="Only a title" secondaryText="And a second text" />
<Card>
<h1> Hello I'm a "children" props</h1>
</Card>
</div>
);
}
【问题讨论】:
标签: typescript styled-components react-typescript