On This Page
I have started using typescript in my react projects, at the beginning, it consumes lots of time to implement especially when we are not much familiar with typescript. But each minute we spend extra is a reward when a project grows.
Besides typescript, I use styled components for styling, because theming, conditional and reusable styling is easier in styled components.
Styled components take props and based on props we can define styling. In typescript, we have to define the types of each prop.
Recreating Error
Let's say we are building a reusable Button component in react, button accepts 3 props, title, variant, and onClick. Based on variant we define button background color, either primary or secondary.
import { FC } from 'react'import styled from 'styled-components'interface ButtonTypes {title: stringvariant?: 'primary' | 'secondary'onClick: (event: React.MouseEvent<HTMLButtonElement>) => void}const ButtonStyle = styled.button`padding: 12px 24px;border: none;outline: none;border-radius: 8px;font-size: 14px;font-weight: 700;cursor: pointer;color: white;background-color: ${({ variant }) => (variant === 'primary' ? '#e8ae1b' : '#7d4b00')};&:disabled {background: #e7e8e9;color: #9fa3a9;cursor: not-allowed;}`const Button: FC<ButtonTypes> = ({ title, onClick, variant = 'primary' }) => {return (<ButtonStyle type="button" onClick={onClick} variant={variant}>{title}</ButtonStyle>)}export default Button
Typescript will keep yelling unless we define style types for variant.
Let's fix this
To fix this we define a separate type for our Button Style. It is exclusive to our button styles so we define it separately.
type StyleTypes = {variant?: 'primary' | 'secondary'}
then ButtonTypes extends StyleTypes
import { FC } from 'react'import styled from 'styled-components'type StyleTypes = {variant?: 'primary' | 'secondary'}interface ButtonTypes extends StyleTypes {title: stringonClick: (event: React.MouseEvent<HTMLButtonElement>) => void}const ButtonStyle = styled.button<StyleTypes>`....background-color: ${({ variant }) => (variant === 'primary' ? '#e8ae1b' : '#7d4b00')};....`const Button: FC<ButtonTypes> = ({ title, onClick, variant = 'primary' }) => {return (<ButtonStyle type="button" onClick={onClick} variant={variant}>{title}</ButtonStyle>)}export default Button
Our Code editor is happy now.