Having default props in a React component is a rather common situation. The most popular way to accomplish this is to pass the default values to a defaultProps property on the function component. However, this property will be deprecated in the future.
Spoiler: due to the sheer amount of code written with it, it never will be deprecated. It’s more likely that a warning will show in the console.
Anyway, in order to keep things clean and guard from this future warning, I came up with a clean pure TypeScript solution to this problem:
interface Props {
name: string;
surname?: string;
age?: number;
}
const defaultProps = {
surname: 'Doe',
};
function MyComponent(props0: Props) {
const props = {...defaultProps, ...props0};
return <div>{props.surname}</div>;
}
The code above provides the correct behavior and proper TypeScript validation. It ended becoming an answer on StackOverflow.
Since the spread order may be a a bit hard to remember, this function does the trick:
export function defProp<P, D>(props: P, defaultProps: D): P & D {
return {...defaultProps, ...props};
}
function MyComponent(props0: Props) {
const props = defProp(props0, defaultProps);
// ...
}