0Pricing
TypeScript Academy · Aula

O Tipo never e os Estados Impossíveis

Modele código inalcançável e valores impossíveis com never.

O Tipo never e os Estados Impossíveis é uma aula grátis de TypeScript Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de TypeScript Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de TypeScript Academy inclui 4 aulas no total.

O tipo never

never é o tipo vazio — representa valores que nunca podem ocorrer. Nenhum valor pode ser atribuído a never (exceto o próprio never). Ele marca situações que deveriam ser impossíveis.

// You cannot create a value of type never
function crash(): never {
  throw new Error('boom');
}
try { crash(); } catch (e) { console.log('caught'); }

Funções que nunca retornam

Uma função que sempre executa throw nunca retorna normalmente, portanto seu tipo de retorno é never. Isso informa aos chamadores (e ao compilador) que a execução termina nesse ponto.

function fail(message: string): never {
  throw new Error(message);
}
try { fail('invalid'); } catch (e) { console.log('handled'); }

Laços infinitos retornam never

Uma função com um laço infinito também nunca retorna, portanto ela também recebe o tipo never. O compilador reconhece que o fluxo de controle não pode continuar depois dela.

function listen(): never {
  while (true) {
    // forever
    break; // (break added so the demo terminates)
  }
  throw new Error('stopped');
}
console.log('listen has return type never');

never e void

Não confunda never com void. Uma função void retorna (ela apenas não produz um valor útil). Uma função never não retorna de forma alguma — ela lança uma exceção ou executa um laço para sempre.

function logIt(): void {
  console.log('done'); // returns normally
}
function abort(): never {
  throw new Error('stop'); // never returns
}
logIt();
try { abort(); } catch (e) { console.log('ok'); }

never em verificações de exaustividade

O uso mais prático de never é verificar a exaustividade. No ramo padrão de um switch, atribua a variável a um never. Se todos os casos forem tratados, a variável já será never e o código compilará.

type Shape = 'circle' | 'square';

function area(s: Shape): string {
  switch (s) {
    case 'circle': return 'pi r^2';
    case 'square': return 'a^2';
    default:
      const _check: never = s; // ok: all handled
      return _check;
  }
}
console.log(area('square'));

Detectando casos ausentes

Se alguém adicionar um novo membro à união, mas esquecer um caso, o valor restante deixará de ser never, e a atribuição não compilará. A verificação com never transforma uma lacuna silenciosa em um erro evidente.

type Shape = 'circle' | 'square' | 'triangle';
// If 'triangle' case is missing, assigning s to never
// would error: 'triangle' is not assignable to never.
console.log('Add a case for every member');

never em ramos impossíveis de uniões

Quando a restrição elimina todas as possibilidades, o tipo restante é never. O compilador sabe que esse ramo é inalcançável, o que pode revelar erros de lógica.

function check(x: string | number): void {
  if (typeof x === 'string') {
    console.log('string');
  } else if (typeof x === 'number') {
    console.log('number');
  } else {
    // x is never here
    console.log('unreachable');
  }
}
check('hi');

never como tipo inferior

never é o tipo inferior: ele pode ser atribuído a qualquer outro tipo, pois um valor que não pode existir é, por vacuidade, compatível com qualquer coisa. É por isso que um throw pode aparecer em qualquer posição de uma expressão.

function getOrThrow(v: string | null): string {
  return v ?? fail();
}
function fail(): never {
  throw new Error('missing');
}
console.log(getOrThrow('value'));

Filtrando uniões para never

Em tipos condicionais e mapeados, never funciona como 'remover isto'. Unir algo a never não muda nada: T | never é simplesmente T. Isso faz dele a escolha natural para filtragem.

type Keep<T> = T extends string ? T : never;
type R = Keep<'a' | 1 | 'b'>; // 'a' | 'b'
const x: R = 'a';
console.log(x);

Modelando estados impossíveis

Use never nas estruturas de objetos para tornar combinações inválidas irrepresentáveis. Aqui, um estado de 'carregamento' não pode também conter dados, porque o tipo o proíbe.

type State =
  | { status: 'loading'; data?: never }
  | { status: 'ready'; data: number };

const s: State = { status: 'ready', data: 7 };
console.log(s);

never aumenta a segurança da refatoração

Como as verificações de exaustividade com never falham quando falta um caso, elas tornam a refatoração mais segura: amplie uma união e o compilador indicará todos os lugares que precisam ser atualizados.

type Cmd = 'start' | 'stop';
function run(c: Cmd): string {
  if (c === 'start') return 'starting';
  if (c === 'stop') return 'stopping';
  const _x: never = c;
  return _x;
}
console.log(run('start'));

Verificação rápida

Teste sua compreensão do tipo never.

Recapitulação: never

Você aprendeu que never:

  • É o tipo vazio — nenhum valor pode ser do tipo never.
  • É o tipo de retorno de funções que lançam uma exceção ou entram em um laço infinito.
  • Ativa as verificações de exaustividade nas cláusulas padrão de switch.
  • Surge em ramificações impossíveis de refinamento e filtra uniões na lógica de tipos.

Em seguida, veremos void e como ele se diferencia.

function assertNever(x: never): never {
  throw new Error('Unexpected: ' + String(x));
}
console.log('assertNever guards exhaustiveness');

Perguntas Frequentes

A aula “O Tipo never e os Estados Impossíveis” é grátis?

Sim — o texto completo de “O Tipo never e os Estados Impossíveis” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de TypeScript Academy, atualize para CoddyKit PRO. O curso de TypeScript Academy inclui 4 aulas no total.

O que vou aprender em “O Tipo never e os Estados Impossíveis”?

Modele código inalcançável e valores impossíveis com never. Você pratica TypeScript Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar TypeScript Academy?

Nenhuma experiência prévia é necessária. TypeScript Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “O Tipo never e os Estados Impossíveis”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de TypeScript Academy?

Sim. Cada aula de TypeScript Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Entendendo unknown versus any
  2. O Tipo never e os Estados Impossíveis
  3. O Tipo void em Funções
  4. Tratamento Seguro de Tipos unknown
← Voltar para TypeScript Academy