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
- Entendendo unknown versus any
- O Tipo never e os Estados Impossíveis
- O Tipo void em Funções
- Tratamento Seguro de Tipos unknown