DEV Community

Max Wiggedal
Max Wiggedal

Posted on

Begineer: TypeScript Utility Types

STOP! You better not be individual that I catch using the any type in my projects. This is only acceptable under very specific circumstances, but should ultimately be eliminated by implementing specific types/interfaces.

Whether you choose to use a type or an interface is mostly a personal preference. However by using a type you can easily make use of the utility functions that TypeScript has built-in. You could make use of them while using an interface too but the syntax gets ugly quickly.

Some of the mostly used utility types are Pick, Omit, Partial and Record.

Pick - Select the keys you want included in the new type.
Omit - Select the keys you want excluded in the new type.
Partial - Indicate that all keys of the type are optional.
Record - Constructs a key/value map type.

For example you might have this type:

type Todo = {
  id: string;
  title: string;
  description: string;
}
Enter fullscreen mode Exit fullscreen mode

but you want to update a todo, but you do not want the id field to be updated, by using the Omit utility type you can exclude it.

function updateTodo(id: string, updatedTodo: Omit<Todo, "id">) {
  // Code to update the todo here
}

updateTodo("todo1", { title: "New title", description: "New description" });
Enter fullscreen mode Exit fullscreen mode

Another example using Record could be for example:

type PokemonType = "fire" | "water" | "grass";

type PokemonSkill = {
  name: string;
  damage: number;
}

type PokemonInfo = {
  name: string;
  health: number;
  skills: PokemonSkill[];
}

const pokedex: Record<PokemonType, PokemonInfo[]> = {
  fire: [
    {
      name: "Charmander",
      health: 100,
      skills: [
        {
          name: "Solar Power",
          damage: 10,
        }
      ]
    }
  ],
  water: [],
  grass: [],
}
Enter fullscreen mode Exit fullscreen mode

In this example we have mapped a key being the type of pokemon to an array of pokemon info. This could be useful if we for example want to display categories of pokemons depending on what type they are.

an alternative way of writing this without using Record would be this, however it does not look as good syntax wise:

const pokedex2: { [pokemonType in PokemonType]: PokemonInfo[] } = {
  fire: [],
  water: [],
  grass: [],
}
Enter fullscreen mode Exit fullscreen mode

Want to learn more? Check out the TypeScript documentation!

Top comments (0)