When written solely as literals, Flow has a tendency to get very verbose very quickly. It is often useful to declare repeated types as type aliases.

Declaring a Type Alias

type illustration for: Declaring a Type Alias

Let's say you're writing functions to manipulate todo lists:

				
					
// Add a new todo item to `todos` and return the new item.

function addTodo(

  todos: Array<{id: number, name: string, completed: boolean}>,

  name: string,

): {id: number, name: string, completed: boolean} {

  // Implementation omitted for brevity.

}



// Get a todo item from `todos` by `id`.

function getTodo(

  todos: Array<{id: number, name: string, completed: boolean}>,

  id: number,

): {id: number, name: string, completed: boolean} {

  // Implementation omitted for brevity.

}



// Get all incomplete todo items in `todos`.

function getIncompleteTodos(

  todos: Array<{id: number, name: string, completed: boolean}>,

): Array<{

  id: number,

  name: string,

  completed: boolean,

}> {

  // Implementation omitted for brevity.

}

				
			

You probably noticed that {id: number, name: string, completed: boolean} gets repeated a lot. Besides being really verbose, this has other problems; if you want to add something to your todo items (dateCompleted, assignedTo, et cetera), you have to edit every single instance of {id: number, name: string, completed: boolean}, which is tedious and error-prone.

So, instead, let's alias that as its own type, TodoItem. It's pretty simple, like declaring a variable:

				
					
type TodoItem = {id: number, name: string, completed: boolean};

				
			

From there, you can use TodoItem as a type as you would any other type.

				
					
// The type alias.

type TodoItem = {id: number, name: string, completed: boolean};



// Add a new todo item to `todos` and return the new item.

function addTodo(todos: Array<TodoItem>, name: string): TodoItem {

  // Implementation omitted for brevity.

}



// Get a todo item from `todos` by `id`.

function getTodo(todos: Array<TodoItem>, id: number): TodoItem {

  // Implementation omitted for brevity.

}



// Get all incomplete todo items in `todos`.

function getIncompleteTodos(todos: Array<TodoItem>): Array<TodoItem> {

  // Implementation omitted for brevity.

}

				
			

Exporting Type Aliases

TodoItem can be used in other files, too. Just mark it as an export like this:

				
					
// todos.js

export type TodoItem = {id: number, name: string, completed: boolean};

// someOtherFile.js

import type {TodoItem} from './todos';



function somethingThatTakesATodoItem(item: TodoItem): void {



}