• Home

    Escolha seu Plano

    Carreiras Alura

    Evolua com profundidade técnica, direção clara e aplicação prática.

    Jornadas guiadas do básico ao avançado com checkpoints práticos, desenhadas para quem busca profundidade e protagonismo técnico.

    Iniciante

    Comece do zero com uma trilha clara e progressiva.

    Fundamentos práticos para dar os primeiros passos com segurança e construir uma base sólida.

    Intermediário

    Continue sua evolução com cursos que conectam fundamentos, ferramentas e prática profissional. Ganhe autonomia, e avance para projetos mais completos.

    Avançado

    Aprofunde temas técnicos e estratégicos para enfrentar desafios mais complexos. Explore boas práticas, arquitetura, performance com visão profissional.

    Cursos

    Ver mais cursos de Back-end
    • Pensamento computacional: fundamentos da computação e lógica de programação
    • Lógica de programação: mergulhe em programação com JavaScript
    • DDD: fundamentos do design orientado a domínio
    • ASP.NET: autenticação e autorização em APIs e aplicações web
    • Microsserviços: migração de monólitos e modularização

    Cursos

    Ver mais cursos de Dados
    • Python para Dados: primeiros passos
    • Excel: domine o editor de planilhas
    • Engenharia de Dados: Orquestração de Pipelines com Apache Airflow
    • Power BI Desktop: construindo meu primeiro dashboard
    • Governança e Arquitetura de Dados

    Cursos

    Ver mais cursos de Inteligência Artificial
    • IA: Explorando o Potencial da Inteligência Artificial Generativa
    • Engenharia de Prompt: Criando Prompts Eficazes para IA Generativa
    • Claude para Análise de Dados: prompts, integrações e automações
    • Agno: criando agentes e sistemas multiagente
    • Engenharia de software na era da IA: segurança de aplicações com agentes, MCPs e código gerado por IA

    Cursos

    Ver mais cursos de Front-end
    • HTML e CSS: ambiente, estrutura e estilo
    • React: realizando testes avançados com Jest e Testing Library
    • React: integrando TypeScript em projetos
    • JavaScript: aprendendo a programar
    • React: aplicando arquiteturas de Micro frontends

    Cursos

    Ver mais cursos de DevOps
    • Sistema Operacional Linux: fundamentos e administração prática
    • Containers e Docker: empacotamento, isolamento e gestão
    • Redes: dos conceitos iniciais à criação de uma intranet
    • Linux: gerenciando diretórios, arquivos, permissões e processos
    • Cibersegurança: Fundamentos e práticas integradas

    Cursos

    Ver mais cursos de UX & Design
    • UX Research: mapeando a experiência da pessoa usuária
    • UX/UI Design: Entregando produtos digitais com IA
    • UI Design: Prototipação e animações interativas
    • Figma: Conhecendo o programa
    • Product Design: métricas e ciclo de vida do produto

    Cursos

    Ver mais cursos de Gestão & Negócios
    • Canva: Criação de landing pages e e-mail marketing
    • Agilidade: como ela pode ajudar a criar um time de alta performance
    • Google Analytics 4: Extrair insights e configurar eventos
    • Management 3.0: gerencie o ambiente, não as pessoas
    • Automação de processos com n8n: Inteligência de dados para Marketing

    Cursos

    Ver mais cursos de Mobile
    • React Native: Estilização e Layouts com Flexbox e StyleSheet
    • Flutter: Graphql e suporte offline
    • Android com Gemini: Trabalhando com textos e imagens na IA
    • Dart: trabalhando com orientação a objetos
    • React Native: Dominando Listas com FlatList e ScrollView

    Carreiras

    Ver mais carreiras
    • Especialista em IA
    • Engenharia de IA
    • Ai native software engineering
    • Arquitetura de Soluções com IA
    • AI Product Design
    • Engenharia de Machine Learning
    • Desenvolvimento Front-End React
    • Engenharia de Dados
    • Cloud Security
    • Social Media Marketing
    • Engenharia de Agentes de IA

    Cursos

    • Engenharia de Prompt: Prompts Eficazes para IA Generativa
    • Claude Code: Criando sua Primeira Aplicação
    • Python: Crie sua Primeira Aplicação
    • Git e GitHub: Compartilhando e Colaborando
    • N8N: Fluxos de Trabalho Avançados

    Cursos

    • Copilot Studio: Solução Multiagentes
    • Padrões de API HTTP e Modelagem de APIs
    • Python para Análise de Dados com SQL
    • Docker: Criando e Gerenciando Containers
    • Design com IA: Otimizando o Processo Criativo

    Cursos

    • Model Context Protocol (MCP)
    • Spec-Driven Development: Dev Assistido por Agentes
    • Arquitetura de Sistemas Distribuídos com Java
    • Governança de Modelos e Reprodutibilidade
    • Pentest: Vulnerabilidades em Aplicações Web

    Escolha seu Plano

    Skills & Go

    O Skills & Go é para Tech Leads, Product Managers, estrategistas e early adopters que transformam ideias em soluções de alto impacto. Em cursos ao vivo e 100% online, você domina a nova era da IA em tempo real.

    Aulas ao vivo

    Saiba mais
    • Agentic Engineering: orquestre múltiplos agentes com confiabilidade
    • Building AI Products: transforme ideias em produtos reais com IA
    • AI Data Strategy: transforme dados em decisões estratégicas com IA

    Escolha seu Plano

    Eventos Alura

    Nossos eventos são pensados para quem quer estar à frente das mudanças em tecnologia, IA e inovação. Em experiências presenciais, você acompanha tendências e se conecta com especialistas que estão moldando o futuro.

    Próximos eventos

    • Imersão Engenharia de Software: Dev na Era da IA
    • IA Conference
    • Alura Signals
  • Talent Lab
  • IA

    Escolha seu Plano

    Conteúdos gratuitos

    Explore conteúdos gratuitos para aprender tecnologia no seu ritmo. Encontre artigos com conteúdos técnicos para aprender na prática, notícias para acompanhar as principais tendências do mercado e o Alura Labs, com análises e reflexões de especialistas sobre tecnologia, IA e carreira.

    Conteúdos gratuitos

    • Artigos
    • Notícias
    • Alura Labs
  • Para Empresas
Ver planos
Links principais
  • Planos e Promoções
  • Links complementares do menu mobile
  • Talent lab
  • Inteligência Artificial
  • Pós Graduações
  • Para Empresas
  • Sobre a Alura
  • Grupo Alun
  • Entrar
    • Home
    • Carreiras
    • Skills & Go
    • Talent Lab
    • Inteligência Artificial
    • Pós Graduações
    • Artigos
    • Sobre a Alura
    • Grupo Alun
    LoginContato
    • LinkedIn
    • Instagram
    • YouTube
    1. Página inicial
    2. Back-end
    3. TypeScript: quando usar unknown em vez de any?

    TypeScript: quando usar unknown em vez de any?

    10 min10 minutos de leitura

    10 min10 minutos de leitura

    Publicado: 12 de Maio

    Última atualização: 15 de Maio

    1. O que é o tipo any?
    2. O que é o tipo unknown?
    3. Como implementar na prática?
    4. Conclusão
    5. Como aprender mais sobre o tema?
    6. FAQ | Perguntas frequentes sobre o tipo Unknown

    Você já sentiu aquela pontada de dúvida ao receber um retorno de uma API ou ao lidar com uma biblioteca externa? 

    Nessas horas, o any parece um abraço quentinho: ele aceita tudo, não reclama de nada e deixa o código rodar. Mas, como diz o ditado no mundo dev, “com grandes poderes vêm grandes responsabilidades” (e, às vezes, grandes erros de runtime). 

    Podemos pensar no any e no unknown como dois guias em uma floresta desconhecida. O any é aquele guia excessivamente otimista que diz: “Pode pisar em qualquer lugar, está tudo bem!”, até que você pisa em um buraco.

    Já o unknown é o guia cauteloso: ele para você na frente de cada arbusto e diz: “Não dê um passo até verificarmos se o chão é firme.” 

    Manter a tipagem segura não é apenas um “capricho” técnico. No mercado atual, onde sistemas escaláveis e colaboração entre grandes times são a regra, a clareza do código é o que separa um projeto de sucesso de um pesadelo de manutenção.

    O unknown é o “irmão responsável” do any, e ele permite que você mantenha a flexibilidade de dados dinâmicos sem abrir mão da proteção que o TypeScript oferece. 

    O que é o tipo any? 

    O any é, essencialmente, a “porta de saída” do sistema de tipos do TypeScript. Quando você atribui any a uma variável, você está dizendo ao compilador: “Ei, confie em mim, eu sei o que estou fazendo. Não precisa validar nada aqui”. 

    É o tipo mais flexível da linguagem, pois ele representa literalmente qualquer valor e permite que você acesse qualquer propriedade ou método sem questionamentos. 

    Na prática, o any costuma aparecer em três cenários principais: 

    1. Migração de JavaScript para TypeScript: Quando o volume de erros é tão grande que o “tipar tudo com any” parece a única saída para fazer o código compilar. 
    2. Pressa no desenvolvimento: Aquele famoso “depois eu arrumo” que acaba ficando para sempre no repositório. 
    3. Dados de origens incertas: Quando a pessoa desenvolvedora não tem certeza da estrutura que virá de um JSON externo. 

    O grande risco aqui é o efeito cascata. Se uma função retorna any, qualquer variável que receba esse valor também perde a proteção de tipo. Em pouco tempo, você terá um código TypeScript que se comporta como JavaScript puro, onde erros como TypeError: ‘x’  is not a function assombram as suas noites. 

    Da uma olhada nesse exemplo propositalmente absurdo: 

    function formataTexto(nome: string): any {  
    return `Olá, ${nome}`;  
    }  
    const listaDeExemplo: number[] = formataTexto("estudante");  
    console.log(listaDeExemplo);  
    console.log(typeof listaDeExemplo);  
    listaDeExemplo.push(42);

    O TypeScript não acusa erro. Mas em tempo de execução, o código quebra. Por quê? Porque a variável listaDeExemplo no momento do push já não é mais um number[]. É uma string. Ou seja: o any permitiu que eu mentisse para o sistema de tipos, e ele acreditou.  

    E o resultado? Bem... 

    “Captura do VS Code mostrando código TypeScript: função formataTexto retorna uma string, atribuída a variável tipada como number[]. No terminal, aparecem “Olá, estudante”, “string” e erro TypeError: listaDeExemplo.push is not a function ao tentar usar push em uma string.”

    É exatamente o tipo de problema que o TypeScript existe para evitar. No fim das contas, any não é apenas “um tipo flexível”, ele é a desativação do TypeScript naquele ponto do código. 

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    O que é o tipo unknown? 

    O unknown é o que chamamos de tipo universal seguro. Assim como o any, você pode atribuir qualquer valor a uma variável do tipo unknown. No entanto, a semelhança para por aí. A grande diferença é que o TypeScript não permite que você faça nada com um valor unknown até que você verifique o que ele é. 

    Captura do VS Code com código TypeScript: função imprimir(msg: string) e variável dado: unknown = "Oi". Ao chamar imprimir(dado), aparece erro TS2345 informando que argumento do tipo unknown não é atribuível ao parâmetro do tipo string.

    A regra de ouro aqui é a cautela: você sabe que algo existe ali dentro, pode ser uma string, um objeto ou um número, por exemplo, mas você não sabe o que é (ainda). 

    Até mesmo tentar acessar a propriedade length em um unknown resultará em um erro de compilação.  

    A semântica do “Eu não sei” 

    Usar unknown comunica uma intenção clara para outras pessoas devs: “Eu recebi esse dado de algum lugar e não posso garantir sua estrutura agora”. É uma forma honesta de programar. Em vez de fingirmos que tudo está sob controle (como o any faz), admitimos a incerteza e preparamos o terreno para uma validação segura. 

    Como implementar na prática? 

    Agora que já entendemos a teoria, vamos colocar a mão na massa. O segredo para dominar o unknown é entender o conceito de Narrowing (estreitamento, afunilamento). Basicamente, é o processo de transformar um tipo genérico e desconhecido em algo específico e utilizável. 

    Quando trabalhamos com unknown, o desafio não é escrever o if, o desafio é não saber o que pode chegar, e é exatamente isso que diferencia esse cenário de quando usamos unions. 

    Cenário A: Tipagem restrita (Unions) 

    Imagine que você está criando uma função que recebe dados que podem ser: 

    • uma string 
    • um array de strings 
    • ou null 

    Aqui você já conhece todas as possibilidades. O TypeScript consegue acompanhar o seu raciocínio conforme você trata cada caso. 

    function imprimirLista(dados: string | string[] | null) { 
      if (Array.isArray(dados)) { 
        dados.forEach(dado => console.log(dado)); 
      }  
      else if (typeof dados === "string") { 
        console.log(dados.toUpperCase()); 
      } 
    }

    Nesse cenário, o narrowing acontece de forma natural. 

    O compilador entende: 

    • se passou pela verificação de array, então só pode ser string[] 
    • se passou pela verificação de string, então só pode ser string 

    Existe uma lista fechada de possibilidades e isso torna o código previsível e mais fácil de modelar. 

    Cenário B: O desafio do unknown 

    Agora imagine um outro caso: você recebe um dado desconhecido, pode ser o valor do localStorage, o resultado de um JSON.parse(), o retorno de uma biblioteca, um evento de usuário, etc. 

    Nesse momento você não tem nenhuma garantia sobre o formato desse dado. 

    É aí que entra o unknown. 

    function processarDesconhecido(valor: unknown) { 
      if (Array.isArray(valor)) { 
        valor.forEach(item => console.log(item)); 
      }  
      else if (typeof valor === "string") { 
        console.log(valor.trim()); 
      } 
    }

    Aqui o TypeScript não possui uma lista prévia de tipos possíveis, ele apenas sabe que esse valor pode ser qualquer coisa. Por isso ele exige que você investigue o dado antes de utilizá-lo. 

    Cada verificação funciona como uma etapa de validação: 

    1. Primeiro testamos se o valor é um array 
    2. Caso não seja, testamos se é uma string 

      Quando uma dessas condições é verdadeira, o tipo é estreitado dentro daquele bloco, ou seja: 

      • antes → unknown 
      • depois → um tipo específico e utilizável 

      Esse é o narrowing acontecendo na prática. 

      Quando o narrowing simples não é suficiente 

      Até agora usamos verificações básicas como o typeof e o Array.isArray, e isso funciona muito bem para tipos primitivos ou estruturas mais simples. Mas e quando estamos lidando com objetos complexos? 

      Por exemplo: 

      • um usuário 
      • um perfil 
      • um produto 
      • um payload de API 

      Nesse caso precisamos de uma forma mais estruturada de validar o tipo. 

      Cenário C: Recebendo dados de APIs externas 

      Ao consumir uma API, não temos controle total sobre o que o servidor envia (especialmente se for um serviço de terceiros). Em vez de tipar o retorno com any, use unknown. 

      async function buscarEndereco(cep: string): Promise<unknown> { 
        const resposta = await fetch(`https://viacep.com.br/ws/${cep}/json/`); 
        if (!resposta.ok) { 
          throw new Error("Erro ao buscar CEP"); 
        } 
        return resposta.json(); 
      } 
      const resultado = await buscarEndereco("01001000");

      Aqui o TypeScript impede o acesso direto às propriedades porque resultado é unknown. Isso nos força a validar antes de usar. 

      O uso de Type Guards 

      Para “desbloquear” o valor dentro de um unknown, usamos funções chamadas Type Guards. Elas verificam o tipo em tempo de execução e informam ao TypeScript que o valor é seguro. 

      Uma resposta típica da API ViaCEP contém campos como: 

      { 
        "cep": "01001-000", 
        "logradouro": "Praça da Sé", 
        "bairro": "Sé", 
        "localidade": "São Paulo", 
        "uf": "SP" 
      }

      Podemos criar uma interface e um Type Guard: 

      interface EnderecoViaCEP { 
        cep: string; 
        logradouro: string; 
        bairro: string; 
        localidade: string; 
        uf: string; 
      } 
      function ehEnderecoViaCEP(dado: unknown): dado is EnderecoViaCEP { 
        return ( 
          typeof dado === "object" && 
          dado !== null && 
          "cep" in dado && 
          "logradouro" in dado && 
          "bairro" in dado && 
          "localidade" in dado && 
          "uf" in dado 
        ); 
      } 
      async function exemplo() { 
        const resultado = await buscarEndereco("01001000"); 
        if (ehEnderecoViaCEP(resultado)) { 
          console.log(resultado.logradouro);  
          console.log(resultado.localidade); 
        } else { 
          console.log("Resposta inesperada da API"); 
        } 
      }
      O que está acontecendo aqui? 
      1. A interface como contrato: Criamos a interface EnderecoViaCEP para definir como esperamos que os dados sejam. É o nosso “cenário ideal”. 
      2. O parâmetro unknown: Note que na função ehEnderecoViaCEP, o dado entra como unknown. Isso é honesto: antes da validação, não podemos garantir que a API não retornou um erro ou um formato vazio. 
      3. O predicado de tipo: O segredo está no retorno dado is EnderecoViaCEP. Assim dizemos ao TypeScript: “Se esta função retornar true, você pode confiar que dado possui todas as propriedades da interface”. 
      4. A checagem de segurança: Dentro do if, o TypeScript faz o narrowing. Note que você pode digitar resultado. e o VS Code vai sugerir “logradouro” ou “localidade” com total confiança. Se o if falhar (caso a API mude o formato, por exemplo), caímos no else e evitamos que o sistema quebre tentando ler uma propriedade que não existe.

      Conclusão

      Chegamos ao fim da nossa jornada entre o permissivo e o seguro. Entender a diferença entre any e unknown é um divisor de águas na carreira de qualquer pessoa que desenvolve com TypeScript. 

      Ao escolher o unknown, você não está apenas silenciando o compilador, você está assumindo o compromisso de escrever um código mais resiliente, legível e profissional.

      É uma mudança de mentalidade que transforma o "programar por tentativa e erro" em "programar com confiança", aplicando conceitos de Clean Code desde a base da sua aplicação. 

      Como aprender mais sobre o tema?

      Essa mesma mentalidade é exatamente o que a Carreira de Desenvolvimento Front-End React propõe: uma evolução estruturada que vai além de “fazer funcionar”, preparando você para construir aplicações robustas, aplicar boas práticas arquiteturais e tomar decisões técnicas com confiança.  

      Ao dominar tipagem, testes, performance e padrões modernos dentro do ecossistema React, você transforma conhecimento em maturidade profissional, dando passos consistentes rumo à autonomia e, no futuro, à liderança técnica. 

      FAQ | Perguntas frequentes sobre o tipo Unknown 

      1. O unknown substitui o any em 100% dos casos? 

      Quase todos. O any ainda tem seu lugar em testes rápidos ou prototipagem inicial. Para produção, prefira sempre o unknown. 

      2. Usar unknown deixa o código mais lento? 

      Não. O TypeScript é removido na compilação. O custo é apenas o pequeno tempo de escrever as validações de tipo, o que economiza horas de debug depois. 

      3. Qual a diferença entre usar unknown e fazer um Type Assertion (as)? 

      O unknown obriga você a provar o tipo através de lógica (como typeof ou if). Já o Type Assertion (valor as Endereco) é você “forçando a barra” e dizendo ao compilador: “Trate isso como Endereco”. O assertion é mais arriscado, pois se o dado vier errado da API, o TypeScript não vai te avisar e o erro vai estourar no console da pessoa usuária. 

      4. Posso usar unknown para tipas o JSON.parse()? 

      Sim, e essa é uma excelente prática. Por padrão, o JSON.parse() retorna any, o que é um perigo silencioso. Ao atribuir o resultado a uma variável unknown, você se força a validar o JSON antes de acessar propriedades que podem não existir, tornando o processamento de dados muito mais robusto. 

      Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

      Avalie este artigo

      • Foto de mikedesousa80

        Autor(a)

        mikedesousa80

      Explore por tópico

      • Back-end
      • Dados
      • DevOps
      • Front-end
      • Gestão & Negócios
      • Institucionais
      • Inteligência Artificial
      • Mobile
      • UX & Design

      Leia também

      • Alura
        22/06/2016

        Importando classes no Java

        Ler mais
      • 30/01/2019

        Modelagem OO > Linguagem OO

        Ler mais
      • 15/04/2016

        Java 9 na prática: Inferência de tipos

        Ler mais
      Ver mais conteúdos

      Inscreva-se em nossa Newsletter

      Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.

      Institucional

      • Sobre nós
      • Trabalhe Conosco
      • Para Empresas
      • Para Escolas
      • Política de Privacidade
      • Compromisso de Integridade
      • Termos de Uso
      • Canal de Ética
      • Código de Ética
      • Fale Conosco
      • Documentos Institucionais
      • Status
      Institucional
      • Sobre nós
      • Trabalhe Conosco
      • Para Empresas
      • Para Escolas
      • Política de Privacidade
      • Compromisso de Integridade
      • Termos de Uso
      • Canal de Ética
      • Código de Ética
      • Fale Conosco
      • Documentos Institucionais
      • Status

      A Alura

      • Como Funciona
      • Inteligência Artificial
      • Plataforma
      • Depoimentos
      • Instrutores(as)
      • Dev em <T>
      • Luri, a Inteligência Artificial da Alura
      • IA Conference
      • Cursos Imersivos
      • Perguntas Frequentes
      A Alura
      • Como Funciona
      • Inteligência Artificial
      • Plataforma
      • Depoimentos
      • Instrutores(as)
      • Dev em <T>
      • Luri, a Inteligência Artificial da Alura
      • IA Conference
      • Cursos Imersivos
      • Perguntas Frequentes

      Conteúdos

      • Alura Cases
      • Imersão Engenharia de Software: Dev na Era da IA
      • Artigos
      • Podcasts
      • Artigos de educação corporativa
      Conteúdos
      • Alura Cases
      • Imersão Engenharia de Software: Dev na Era da IA
      • Artigos
      • Podcasts
      • Artigos de educação corporativa
      Uma Empresa do GrupoLogo Grupo Alun

      Outras empresas do Grupo Alun

      • FIAP
      • STARTSE
      • PM3
      • LUMINA

      Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

      Redes Sociais & Apps

      instagram
      youtube
      tiktok
      x
      appStore
      googlePlay
      Uma Empresa do GrupoLogo Grupo Alun

      Outras empresas do Grupo Alun

      • FIAP
      • STARTSE
      • PM3
      • LUMINA

      Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

      Redes Sociais & Apps

      instagram
      youtube
      tiktok
      x
      appStore
      googlePlay
      Alura