TypeScript初心者はこちら。 TypeScript
に変換したいstyled-components
を使用する以下のコンポーネントがあります。
import React from 'react'
import PropTypes from 'prop-types'
import styled from 'styled-components'
const propTypes = {
name: PropTypes.string.isRequired // https://material.io/tools/icons/?style=baseline
}
const Icon = styled(({name, className, ...props}) => <i className={`material-icons ${className}`} {...props}>{name}</i>)`
font-size: ${props => props.theme.sizeLarger};
`
Icon.propTypes = propTypes
export default Icon
propTypes
をinterface
に置き換えることができることはわかっています
interface Props {
name: string
}
しかし、TypeScriptは私がclassName
を宣言しないままにしておくと不平を言います。重要なのは、interface
やclassName
のようなプロップを宣言せずに、開発者が提供できるプロップの一種の仕様としてtheme
を使用するのが理想的です。 styled-components
などのライブラリによって挿入されます。
このコンポーネントをTypeScriptに適切に変換するにはどうすればよいですか?
React Nativeでスタイル付きコンポーネントv5を使用する包括的なアプローチは、プレーンなReactでも機能します。テーマを使用していない場合は、下部のStyledProps
セクション。
テーマのタイプを定義します。
// MyTheme.ts
export type MyTheme = {
colors: {
primary: string;
background: string;
};
};
テーマのタイプを使用します。
// themes.ts
export const LightTheme: MyTheme = {
colors: {
primary: 'white',
background: 'white',
},
};
export const DarkTheme: MyTheme = {
colors: {
primary: 'grey',
background: 'black',
},
};
MyThemeタイプをスタイル付きコンポーネントのデフォルトのテーマに「マージ」するには、 declaration merging を使用します。
// styled.d.ts
import 'styled-components';
import { MyTheme } from '../src/themes/MyTheme';
declare module 'styled-components' {
// eslint-disable-next-line @TypeScript-eslint/no-empty-interface
export interface DefaultTheme extends MyTheme {}
}
うんいいね。 theme
プロパティが正しく入力されています。
コンポーネント自体はどうですか?
特定のコンポーネントプロップをStyledProps
タイプでラップします。
import { StyledProps } from 'styled-components';
import styled from 'styled-components/native';
type MyViewProps = StyledProps<{
backgroundColor?: string;
isAlert?: boolean;
}>;
const MyView = styled.View(
(props: MyViewProps) => `
background-color: ${props.backgroundColor || props.theme.colors.background};
color: ${props.isAlert ? red : props.theme.colors.primary}
`,
);
この例では、両方のprops.backgroundColor
およびprops.theme.colors.background
は自動補完されます。 MyTheme
タイプまたは特定のコンポーネントタイプを更新すると、機能するはずです。 ????