私はこの投稿をフォローしています: https://medium.com/@samuelresua/easy-media-queries-in-styled-components-690b78f5005
TypeScriptで次のコードを作成しましたが、思った以上にany
に入力する必要がありました。
const breakpoints: ObjectMap<number> = {
small: 767,
medium: 992,
large: 1200,
extraLarge: 1240
};
export const media = Object.keys(breakpoints).reduce((acc: { [key: string]: (...args: any) => any }, label) => {
acc[label] = (...args) => css`
@media (min-width: ${breakpoints[label]}px) {
${css(...args as [any])};
}
`;
return acc;
}, {});
その結果、メディアクエリブロックでスタイルを記述しているとき、IDEには何の助けもありません。
styled.button<Props>`
background: red; /* this must be a valid style */
${({ theme }) => theme.media.large`
background: blue;
foo: bar; /* this isn't caught */
`
media
関数を改善する方法を知っている人はいますか?
styled-components
を使用すると、CSSプロパティのオブジェクトとテンプレート文字列を使用できます。オブジェクトは、TypeScriptコンパイラによってよりよく理解されます。これを試して:
const breakpoints: ObjectMap<number> = {
small: 767,
medium: 992,
large: 1200,
extraLarge: 1240
};
export const media = (size: keyof typeof breakpoints, properties: CSSObject) => ({[`@media (min-width: ${breakpoints[size]})`]: properties});
const MyButton = styled.button<Props>(({ theme }) => ({
background: red, // this must be a valid style
...theme.media('large', {
background: blue // this is also validated :)
})
}));
私が正しく理解していれば、any
を取り除く必要があります。
方法は次のとおりです。
import {
css,
CSSObject,
SimpleInterpolation,
FlattenSimpleInterpolation,
} from 'styled-components';
type ObjectMap<T> = {[key: string]: T};
const breakpoints: ObjectMap<number> = {
small: 767,
medium: 992,
large: 1200,
extraLarge: 1240,
};
export const media = Object.keys(breakpoints).reduce(
(
acc: {
[key: string]: (
first: TemplateStringsArray | CSSObject,
...interpolations: SimpleInterpolation[]
) => FlattenSimpleInterpolation;
// ^^^ this is the first implementation of `BaseThemedCssFunction`
},
label
) => {
acc[label] = (...args) => css`
@media (min-width: ${breakpoints[label]}px) {
${css(...args)};
}
`;
return acc;
},
{}
);