How to Use TypeScript and TSX for WordPress block development

blockify Avatar

·

·

Welcome to our tutorial on using TypeScript and TSX for WordPress block development!

TypeScript is a powerful programming language that extends JavaScript with features like type declarations and interfaces. TSX is a strict syntactical superset of TypeScript that allows you to use JSX syntax in your TypeScript code. Together, these tools can be incredibly useful for WordPress block development, allowing you to write cleaner, more reliable code.

In this tutorial, we’ll go over everything you need to know to get started using TypeScript and TSX for your WordPress block development projects. We’ll cover everything from installing the necessary dependencies to configuring your build tool. By the end of this tutorial, you’ll be well on your way to using these powerful tools in your WordPress block development projects.

Quick example of the benefits of TypeScript type checking

First, here is an example of how you might use an if statement in JavaScript to check the type of the name argument in a function used to greet users:

Copied!
function greet(name) { if (typeof name === 'string') { return <p>Hello, {name}!</p>; } else { return <p>Error: name must be a string</p>; } } greet(123);Code language: JavaScript (javascript)


In this case, we’ve added an if statement to check the type of the name argument before returning the JSX element. If the name argument is a string, we return the greeting element. If it is not a string, we return an error element.

Using an if statement like this can help us catch mistakes in our code and ensure that our blocks are working as intended. However, it can also add extra clutter to our code and make it more difficult to read and maintain.

On the other hand, with TypeScript and TSX, we can simply declare the type of the name argument as a string and the TypeScript compiler will catch any errors for us. Here is the equivalent code in TSX:

Copied!
function greet( name: string ) : string { return <p>Hello, {name}!</p>; } greet(123);Code language: JavaScript (javascript)


In this case, the TypeScript compiler will throw an error because the type of the name argument is declared as a string, but we’ve passed a number to the greet function. This helps us catch mistakes in our code without having to add extra if statements or type checks.

TypeScript allows us to catch errors before we run our code and helps us write more reliable and maintainable code. It can save us from having to add extra type checks or if statements to our code, which can make our code more concise and easier to read.

The benefits increase as your project grows in complexity
TypeScript can be especially useful for catching errors in complex projects with many components and types.

As your project grows in size and complexity, it can become more difficult to keep track of all the different types and variables in your code. This is where TypeScript’s type checking can really come in handy. By declaring the types of your variables and function arguments, you can catch errors before you run your code and ensure that your blocks are working as intended.

For example, let’s say you have a large block with many different components, each with their own props and state. Without type declarations, it can be difficult to keep track of what data is being passed between components and how it is being used. This can lead to bugs and errors that can be difficult to track down and fix.

However, with TypeScript, you can declare the types of your props and state variables, as well as the types of the data that your functions return. This can help you catch errors early on and ensure that your block is working as intended, and depending on your IDE, can make writing code much more enjoyable.

Adding support for TypeScript and TSX to your project
This assumes that you already have a project setup. You will need to add the following files:

tsconfig.json

Copied!
{ "compilerOptions": { "target": "ES6", "jsx": "react-jsx", "esModuleInterop": true, "resolveJsonModule": true, "moduleResolution": "node", "allowSyntheticDefaultImports": true, "strict": true }, "include": [ "src" ], "exclude": [ "assets/js", "build", "node_modules", "vendor" ] }Code language: JSON / JSON with Comments (json)


webpack.config.js

The below example demonstrates how to create a simple webpack plugin to run after compiling, which updates the copied block.json files in the build directory to the correct file types and paths:

Copied!
const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); const path = require( 'path' ); const fs = require( 'fs' ); const glob = require( 'glob' ); const rename = () => { const { join } = path; const blockJsonFiles = glob.sync( join( process.cwd(), 'build', '**', 'block.json' ), ); if ( blockJsonFiles ) { blockJsonFiles.forEach( filePath => { let blockJson = require( filePath ); if ( blockJson?.editorScript ) { blockJson.editorScript = blockJson.editorScript.replace( '.tsx', '.js' ); } if ( blockJson?.script ) { blockJson.script = blockJson.script.replace( '.tsx', '.js' ); } if ( blockJson?.viewScript ) { blockJson.viewScript = blockJson.viewScript.replace( '.tsx', '.js' ); } if ( blockJson?.editorStyle ) { blockJson.editorStyle = blockJson.editorStyle.replace( '.scss', '.css' ); } if ( blockJson?.style ) { blockJson.style = blockJson.style.replace( '.scss', '.css' ); } fs.writeFile( filePath, JSON.stringify( blockJson, null, 2 ), function writeJSON( error ) { if ( error ) { return console.log( error ); } } ); } ); } }; module.exports = env => { return { ...defaultConfig, module: { ...defaultConfig.module }, plugins: [ ...defaultConfig.plugins, { apply: compiler => { compiler.hooks.afterEmit.tap( 'rename', rename ); } }, ] }; };Code language: JavaScript (javascript)

Conclusion

In conclusion, using TypeScript in your WordPress block development projects can be a valuable tool for catching errors before you run your code and writing cleaner, more maintainable code. With TypeScript’s type checking capabilities, you can ensure that your blocks are working as intended and save time and hassle debugging issues.

Overall, TypeScript can be especially useful for large and complex projects with many components, as it can catch issues that might not be immediately obvious in JavaScript. If you’re looking to improve the reliability and maintainability of your WordPress block development projects, consider giving TypeScript a try.

We hope this tutorial has been helpful in introducing you to the benefits of using TypeScript for WordPress block development. We If you have any questions or want to learn more, don’t hesitate to reach out.