mkaz.blog

Create a Block in Typescript

I've been reading and learning Typescript recently, and I quite like it. The added type safety is a great feature to help create more error-free and stable code. You can read more about Typescript here.

This got me thinking that it should be possible to create a WordPress Block in Typescript, which of course it is.

For the impatient, the stubbed repo: https://github.com/mkaz/tsblock

Build & Config

The block setup uses the same wp-scripts config from @wordpress/scripts package and extends webpack adding the ts-loader and resolver for the appropriate extensions.

Block Adjustments

Typescript + React

Typescript works with React fine, see the Typescript JSX documentation for details. The biggest change is likely adding types for your properties, here is an example for the src/edit.tsx

import * as React from 'react';
import { __ } from '@wordpress/i18n';
 
type EditProps: {
	"className": string,
};
 
const Edit = ( { className }: EditProps ) => {
	return (
		<p className={ className }>
			{ __( 'Hi from the editor!', 'tsblock' ) }
		</p>
	);
}
 
export default Edit;

WordPress Packages

Depending on the packages you use for your block, you may need to add additional type support. The following was done to add types for the @wordpress/blocks package used.

$ yarn add @types/wordpress__blocks

For example, if your block uses components from @wordpress/components you will need to add the necessary types. Use:

$ yarn add @types/wordpress__components

Summary

To get started, you can clone the repo (or copy the configs) from: https://github.com/mkaz/tsblock

There really isn't too much difference in developing blocks in Typescript. Writing in Typescript might take a bit longer, since you need to be more explicit with your functions and parameters. However, this is what provides the type safety to catch potential bugs. For example, are all those required parameters passed in? Do parameter names and types match? Etc...

It is much nicer to catch bugs in the compile step during development, then by users in production.

Thanks to @beau.collins.pub for the assist.