I am using React with TypeScript. I am also using PropTypes. TypeScript is intended for compile time type checking while PropTypes validate passed props on run time (development mode). So I found myself writing types twice. Both TypeScript and PropTypes. For example, component ListingsList:
interface ListingsListProps {
listings: Listing[];
height: number;
width: number;
rowHeight: number;
forwardedRef?: Ref<List>;
className?: string;
}
const ListingsList: FunctionComponent<ListingsListProps> = props => {
...
...
};
ListingsList.propTypes = {
listings: PropTypes.arrayOf(listingPropType.isRequired).isRequired,
height: PropTypes.number.isRequired,
width: PropTypes.number.isRequired,
rowHeight: PropTypes.number.isRequired,
forwardedRef: PropTypes.shape({ current: PropTypes.instanceOf(List).isRequired }),
className: PropTypes.string,
};
Each time I made a mistake (defining a property differently in PropTypes and in TypeScript), I get typescript error. Sometimes I don't really know how to define the PropType. For example, when passing History property from 'history'. I don't want to define History PropType myself because it has a complicated shape. I saw there are projects that generates TypeScript from PropTypes but I really don't like it because TypeScript is much stronger, I can define more detailed types. I am looking for a way to generate PropTypes from TypeScript, and I think this is a must feature for React developers.
You can use babel-plugin-typescript-to-proptypes. It requires either the @babel/plugin-syntax-jsx
plugin or the @babel/preset-react
preset.
Use npm install --save-dev babel-plugin-typescript-to-proptypes
to install.
And here is a sample babel.config.js
:
const plugins = [];
if (process.env.NODE_ENV !== 'production') {
plugins.push('babel-plugin-typescript-to-proptypes');
}
module.exports = {
// Required
presets: ['@babel/preset-typescript', '@babel/preset-react']
plugins,
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With