これが私のスタイル付きコンポーネントです。
import * as React from 'react';
import styled from 'styled-components';
import { ComponentChildren } from 'app-types';
interface Props {
children: ComponentChildren;
emphasized: boolean;
}
const HeadingStyled = styled.h2`
${props => props.emphasized && css`
display: inline;
padding-top: 10px;
padding-right: 30px;
`}
`;
const Heading = (props: Props) => (
<HeadingStyled>
{props.children}
</HeadingStyled>
);
export default Heading;
次の警告が表示されます。
Property 'emphasized' does not exist on type 'ThemedStyledProps<DetailedHTMLProps<HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>, any>'.
Cannot find name 'css'. Did you mean 'CSS'?
これを機能させるにはどうすればよいですか?
styled("h2")<IProps>
のようなコンポーネントに渡すプロップを指定する必要があります。パターンの詳細については、 documentation から読むことができます。css
はここでは必要ありません。実際に関数からCSSを返す必要がある場合にヘルパーとして追加されます。 条件付きレンダリング を確認してください。これらを考慮すると、コンポーネントは次のようになります。
const HeadingStyled = styled("h2")<{emphasized: boolean}>`
${props => props.emphasized && `
display: inline;
padding-top: 10px;
padding-right: 30px;
`}
`;
以前の答えは私にとってはうまくいきましたが、私の場合にも役立ついくつかの情報を追加するだけです:
StyledComponentsは、「ThemedStyledFunction」インターフェイスを使用して、ユーザーが追加のプロップタイプを定義できるようにします。
つまり、次のようなインターフェイスを作成できます。
interface HeadingStyled {
emphasized: boolean;
}
そして、コンポーネントでそれを使用します:
const HeadingStyled = styled("h2")<HeadingStyled>`
${props => props.emphasized && `
display: inline;
padding-top: 10px;
padding-right: 30px;
`}
`;
(複数の小道具がある場合に、@ BoyWithSilverWingsが提案したものを実装するよりクリーンな方法です)
詳細については、このディスカッションを確認してください。
https://github.com/styled-components/styled-components/issues/1428#issuecomment-358621605