Io Ts

Posted September 3, 2023 by Rohith and Anusha ‐ 3 min read

TypeScript has revolutionized the world of JavaScript by adding static typing capabilities to the language. However, when it comes to ensuring type safety for complex data structures, especially when dealing with external data sources like APIs, additional tools are often necessary. Enter io-ts, a powerful TypeScript library that allows developers to define and validate data structures at runtime with the same confidence as they do with compile-time type checking.

What is io-ts?

  • io-ts is a library that leverages TypeScript’s type system to provide a runtime validation framework for data structures.

  • It was created by Giulio Canti and has gained popularity for its simplicity and effectiveness in ensuring type safety. io-ts is built on two main concepts: Type and TypeOf.


  • In io-ts, a Type is a representation of a runtime type.

  • It can be thought of as a combination of a TypeScript type and a validation function.

  • A Type defines the expected shape of your data and can be used to both encode (serialize) and decode (parse) data.


  • TypeOf is a utility that extracts the TypeScript type from a given Type.

  • This is incredibly useful for type checking and inference.

Using io-ts

  • Let’s dive into a practical example to understand how io-ts works.

  • Suppose you are working on a web application that communicates with a JSON-based API.

  • You want to ensure that the data you receive from the API matches your expected structure.

import * as t from "io-ts";

// Define a runtime type for a user object
const User = t.type({
  id: t.number,
  username: t.string,
  email: t.string,
  // ... other fields

// Example JSON data received from the API
const apiResponse = {
  id: 123,
  username: "jsmith",
  email: "",
  // ... other fields

// Decode the API response using the User type
const decodedUser = User.decode(apiResponse);

if (decodedUser._tag === "Left") {
  // Handle validation error
} else {
  // Use the validated user data
  const user = decodedUser.right;
  console.log(`User: ${user.username}`);

In the above example

  • We define a User type that specifies the expected shape of a user object.

  • We decode the apiResponse using the User type.

  • If the data does not match the expected structure, decode returns a validation error.

  • We handle the validation result, ensuring that we only proceed with valid data.

Benefits of Using io-ts

Runtime Type Validation

  • io-ts allows you to validate data structures at runtime, which is particularly useful when dealing with external data sources like APIs.

Type Inference

  • By using TypeOf, TypeScript can infer the types of your validated data, reducing the need for explicit type annotations.


  • You can compose complex data structures from smaller Type definitions, making it easy to handle nested and complex data.

Error Handling

  • io-ts provides a structured way to handle validation errors, enabling you to provide meaningful feedback to users or log detailed error information for debugging.

Custom Validators

  • You can create custom validation functions for more complex validation logic.


  • The io-ts library empowers TypeScript developers to achieve a higher level of type safety by extending static type checking to runtime data validation.

  • Whether you’re working with APIs, handling form submissions, or any other scenario where data integrity is critical, io-ts can be a valuable addition to your TypeScript toolbox.

  • It simplifies the process of defining and validating data structures, ensuring that your applications handle data with confidence and precision, while benefiting from TypeScript’s static type system.

quick-references blog io-ts

Subscribe For More Content