Flow Type Aliases

Matthew Garcia

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

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 {

}
  Tweet It
✖ Clear

🕵 Search Results

🔎 Searching...