Try it yourself with our free Json To Typescript tool — runs entirely in your browser, no signup needed.

How to Convert JSON to TypeScript types for API Responses

How to Convert JSON to TypeScript Types for API Responses

When working with APIs, it's common to receive JSON data in response to requests. However, when using TypeScript, it's essential to define types for this data to ensure type safety and enable better code maintainability. In this article, we'll explore how to convert JSON to TypeScript types for API responses, providing a practical guide with real-world scenarios, best practices, and common mistakes to avoid.

Quick Example

Here's a minimal example of how to convert a JSON object to a TypeScript type:

import { json } from 'body-parser';

interface User {
  id: number;
  name: string;
  email: string;
}

const jsonUserData = {
  id: 1,
  name: 'John Doe',
  email: 'john.doe@example.com',
};

const userData: User = jsonUserData;

console.log(userData); // { id: 1, name: 'John Doe', email: 'john.doe@example.com' }

In this example, we define a User interface that matches the structure of the JSON data. We then assign the JSON object to a variable of type User, ensuring that the data conforms to the defined type.

Real-World Scenarios

Scenario 1: API Response with Nested Objects

Suppose we have an API that returns a response with nested objects:

{
  "data": {
    "user": {
      "id": 1,
      "name": "John Doe",
      "email": "john.doe@example.com"
    },
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "state": "CA",
      "zip": "12345"
    }
  }
}

We can define TypeScript types for this response as follows:

interface Address {
  street: string;
  city: string;
  state: string;
  zip: string;
}

interface UserData {
  user: {
    id: number;
    name: string;
    email: string;
  };
  address: Address;
}

interface ApiResponse {
  data: UserData;
}

const apiResponse: ApiResponse = {
  data: {
    user: {
      id: 1,
      name: 'John Doe',
      email: 'john.doe@example.com',
    },
    address: {
      street: '123 Main St',
      city: 'Anytown',
      state: 'CA',
      zip: '12345',
    },
  },
};

Scenario 2: API Response with Arrays

Suppose we have an API that returns a response with an array of objects:

{
  "data": [
    {
      "id": 1,
      "name": "John Doe",
      "email": "john.doe@example.com"
    },
    {
      "id": 2,
      "name": "Jane Doe",
      "email": "jane.doe@example.com"
    }
  ]
}

We can define TypeScript types for this response as follows:

interface User {
  id: number;
  name: string;
  email: string;
}

interface ApiResponse {
  data: User[];
}

const apiResponse: ApiResponse = {
  data: [
    {
      id: 1,
      name: 'John Doe',
      email: 'john.doe@example.com',
    },
    {
      id: 2,
      name: 'Jane Doe',
      email: 'jane.doe@example.com',
    },
  ],
};

Scenario 3: API Response with Optional Properties

Suppose we have an API that returns a response with optional properties:

{
  "data": {
    "id": 1,
    "name": "John Doe",
    "email": "john.doe@example.com",
    "phone": "123-456-7890"
  }
}

We can define TypeScript types for this response as follows:

interface UserData {
  id: number;
  name: string;
  email: string;
  phone?: string;
}

interface ApiResponse {
  data: UserData;
}

const apiResponse: ApiResponse = {
  data: {
    id: 1,
    name: 'John Doe',
    email: 'john.doe@example.com',
    phone: '123-456-7890',
  },
};

Best Practices

  1. Use interfaces: When defining TypeScript types for API responses, use interfaces to describe the structure of the data.
  2. Use type annotations: Use type annotations to specify the types of variables, function parameters, and return types.
  3. Use optional properties: Use optional properties to indicate that a property may or may not be present in the data.
  4. Use arrays and tuples: Use arrays and tuples to represent collections of data.
  5. Keep types concise: Keep TypeScript types concise and focused on the specific data structure being represented.

Common Mistakes

Mistake 1: Missing Type Annotations

const apiResponse = {
  data: {
    id: 1,
    name: 'John Doe',
    email: 'john.doe@example.com',
  },
};

Corrected Code:

interface UserData {
  id: number;
  name: string;
  email: string;
}

const apiResponse: { data: UserData } = {
  data: {
    id: 1,
    name: 'John Doe',
    email: 'john.doe@example.com',
  },
};

Mistake 2: Incorrect Type Definitions

interface UserData {
  id: string;
  name: number;
  email: string;
}

const apiResponse: { data: UserData } = {
  data: {
    id: 1,
    name: 'John Doe',
    email: 'john.doe@example.com',
  },
};

Corrected Code:

interface UserData {
  id: number;
  name: string;
  email: string;
}

const apiResponse: { data: UserData } = {
  data: {
    id: 1,
    name: 'John Doe',
    email: 'john.doe@example.com',
  },
};

Mistake 3: Missing Optional Properties

interface UserData {
  id: number;
  name: string;
  email: string;
  phone: string;
}

const apiResponse: { data: UserData } = {
  data: {
    id: 1,
    name: 'John Doe',
    email: 'john.doe@example.com',
  },
};

Corrected Code:

interface UserData {
  id: number;
  name: string;
  email: string;
  phone?: string;
}

const apiResponse: { data: UserData } = {
  data: {
    id: 1,
    name: 'John Doe',
    email: 'john.doe@example.com',
  },
};

FAQ

Q: What is the difference between an interface and a type in TypeScript?

A: An interface is used to define the structure of an object, while a type is used to define the type of a value.

Q: How do I handle optional properties in TypeScript?

A: Use the ? symbol to indicate that a property is optional.

Q: Can I use TypeScript with JavaScript?

A: Yes, TypeScript is a superset of JavaScript, so you can use it with existing JavaScript code.

Q: How do I convert a JSON object to a TypeScript type?

A: Use the interface keyword to define a TypeScript type that matches the structure of the JSON object.

Q: What is the purpose of type annotations in TypeScript?

A: Type annotations are used to specify the types of variables, function parameters, and return types, ensuring type safety and better code maintainability.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp