In React, it’s common to create a component that accepts all native element props in addition to our custom ones. And, naturally, we don’t want to do this manually.
For this purpose, React offers a solution.
Generic type ComponentProps<T>
"undefined" anchor link
React provides a generic type ComponentProps<T>
that extracts the type of the props from any element or component.
When extending a native DOM element, it’s essential to set the element’s name as the generic (T
). Then, we extend this type with our custom properties types.
Example"undefined" anchor link
Let’s create a component that extends the native button
element. This MyButton
component will include two props primary
and size
. Also, don’t forget to pass the props
destructuring to the component!
import styles from './styles.module.css'import { ComponentProps } from 'react'
interface ComponentProps extends ComponentProps<'button'> { primary?: boolean size?: 'small' | 'medium' | 'large'}
export default function MyButton({ primary = false, size = 'medium', children, ...props}: ComponentProps) { const style = `${styles.button} ${primary ? styles['button--primary'] : ''} ${size ? styles[`button--${size}`] : ''}`
return ( <button className={style} {...props} > {children} </button> )}
And now, we can use the component with both native and custom properties.
import MyButton from './MyButton'
function onClick(e: React.MouseEvent<HTMLElement>) { alert('Hello!')}
export function MyPage() { return ( <MyButton
size='medium'
onClick={onClick} type='button' disabled > Click me! </MyButton> )}
Using this React type helper will greatly facilitate and expedite the development of components where we want to extend native elements.
I hope you found this article useful.
Happy coding! 🚀