Menu

Type alias em TypeScript: a palavra-chave type com exemplos

Um type alias dá nome a qualquer tipo com a palavra-chave type: formatos de objeto, unions, tuplas, funções, generics e tipos recursivos. Veja a sintaxe, como fica cada forma e por que um alias é só um nome, e não um tipo novo e separado.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Um type alias dá nome a um tipo. Você escreve type Name = ... e, a partir daí, Name pode ser usado em qualquer lugar em que um tipo é esperado. Diferente de uma interface, um alias pode dar nome a qualquer tipo, e não só a formatos de objeto.

Aliases existem só em tempo de compilação. O JavaScript gerado não contém nenhuma dessas linhas type.

Sintaxe

type Name = SomeType;
type Name<T> = SomeTypeUsing<T>;       // generic
export type Name = SomeType;           // exported from a module

Por convenção, os nomes são em PascalCase. O lado direito é qualquer expressão de tipo, e um alias pode usar outros aliases, inclusive a si mesmo (veja os tipos recursivos mais abaixo). O alias fica disponível em todo o escopo em que é declarado, até acima da linha da declaração, porque os tipos são verificados em tempo de compilação e não executados em ordem como const ou let.

Tipos de objeto

Para um formato de objeto, um alias e uma interface se escrevem quase do mesmo jeito. O alias usa = e normalmente termina com ponto e vírgula.

Um alias não pode usar extends; a intersection & cumpre esse papel. A verificação de propriedades extras e as propriedades opcionais e readonly funcionam exatamente como nas interfaces. Qual dos dois escolher para formatos de objeto é assunto da página sobre interface vs type.

Unions, tuplas e funções

Estes são os casos que só um alias pode nomear, e o principal motivo de o type existir. Um alias de union lista as alternativas, um alias de tupla fixa o tamanho e os tipos dos elementos de um array, e um alias de função descreve uma assinatura.

Em scale, os parâmetros não precisam de anotação: o alias Transform fornece os tipos deles. A sintaxe de tuplas está em tuplas, e o narrowing de unions na página sobre union types.

Type aliases genéricos

Type parameters fazem um único alias funcionar para muitos tipos. Eles podem ter padrões, como os parâmetros de função.

Result<number> usa o padrão E = string. Aliases genéricos pequenos como type Nullable<T> = T | null ou type Dict<T> = Record<string, T> são comuns em código real. Os utility types nativos (Partial<T>, Pick<T, K>, ReturnType<F>) também são aliases genéricos, declarados na biblioteca padrão.

Aliases são nomes, não tipos novos

Um alias não cria um tipo distinto. Ele é um segundo nome para o tipo da direita, e o compilador trata os dois como idênticos. Dois aliases de string são totalmente intercambiáveis:

Isso imprime cancelling u_42 sem erro nenhum, que é justamente o bug que um alias não consegue evitar. O alias ainda ajuda quem lê (um parâmetro tipado como OrderId diz mais que string), mas se confundir dois ids precisa ser um erro de compilação, use um branded type como string & { readonly __brand: "OrderId" }.

Type aliases recursivos

Um alias pode referenciar a si mesmo, e é assim que se descrevem árvores, listas aninhadas e JSON:

O alias Json rejeita valores que o JSON não consegue representar: { when: new Date() } ou { f: undefined } atribuídos a Json são erros de compilação (TS2322).

Tipos a partir de valores: typeof

Quando um valor já existe, você pode nomear o tipo dele em vez de escrevê-lo. O operador de tipo typeof lê o tipo de uma variável, e se combina com outros operadores:

const defaults = { retries: 3, verbose: false, level: "info" };

type Options = typeof defaults;
// { retries: number; verbose: boolean; level: string }

type OptionKey = keyof typeof defaults;
// "retries" | "verbose" | "level"

function start(port: number) {
  return { port, startedAt: new Date() };
}
type Server = ReturnType<typeof start>;
// { port: number; startedAt: Date }

O valor continua sendo a única fonte da verdade: adicione uma propriedade a defaults e Options acompanha. Mais sobre isso em typeof.

Exportando e importando aliases

Aliases são exportados e importados como valores. import type deixa explícito que só um tipo é importado, então o import sempre é removido da saída JavaScript:

// shapes.ts
export type Point = { x: number; y: number };
export type Shape = { kind: "circle"; center: Point; radius: number };

// main.ts
import type { Point, Shape } from "./shapes.js";

const p: Point = { x: 1, y: 2 };

Perguntas frequentes

O que é um type alias no TypeScript?

Um type alias é um nome para um tipo, declarado com a palavra-chave type: type Point = { x: number; y: number }. Depois disso, Point pode ser usado em qualquer lugar em que um tipo é esperado. Ele pode dar nome a qualquer tipo: um formato de objeto, uma union, uma tupla, uma assinatura de função, um primitivo ou um tipo genérico.

Um type alias cria um tipo novo?

Não. Um alias é só outro nome para um tipo existente. Com type UserId = string e type OrderId = string, um UserId pode ser passado onde um OrderId é esperado, porque os dois são apenas string. Para criar tipos que não sejam intercambiáveis, use um branded type.

Um type alias pode referenciar a si mesmo?

Sim, desde que a autorreferência esteja aninhada dentro de um tipo de objeto, um array ou uma tupla: type TreeNode = { value: number; children: TreeNode[] } e um alias Json que inclui Json[] funcionam. Uma referência direta como type Loop = Loop | string gera o erro TS2456, Type alias 'Loop' circularly references itself.

Um type alias pode ser genérico?

Sim. Coloque os type parameters depois do nome: type Box<T> = { value: T } e use como Box<number>. Os parâmetros podem ter padrões (type Result<T, E = string> = ...) e restrições (type Keys<T extends object> = keyof T).

Como obter um tipo a partir de um objeto existente?

Use o operador de tipo typeof: const defaults = { retries: 3, verbose: false }; type Options = typeof defaults; dá { retries: number; verbose: boolean }. Isso mantém uma única fonte da verdade quando o valor vem primeiro.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR