Introdução: "Será que minha string está aqui?" — a eterna pergunta do desenvolvedor
Você está escrevendo código em TypeScript e de repente surge a pergunta: "Como verifico se um array contém uma determinada string?" Parece um detalhe, mas disso depende o funcionamento de filtros, validação de formulários, busca em listas e centenas de outros cenários. Esta pergunta no Stack Overflow acumulou milhares de visualizações — o que significa que ela atormenta não apenas iniciantes, mas também desenvolvedores experientes.
Hoje vamos analisar todas as formas legítimas de verificar a presença de uma string em um array no TypeScript. Mas não vamos apenas listar métodos — vamos olhar sob o capô do desempenho, descobrir qual opção é mais rápida e quando usar estruturas de dados avançadas. Você aprenderá a escrever não apenas código funcional, mas código rápido e elegante.
Vamos nessa! 🚀
Método includes(): simplicidade e legibilidade
A maneira mais óbvia e moderna é o método includes(). Ele surgiu no ES2016 e é nativamente suportado pelo TypeScript. Tudo o que você precisa fazer é chamá-lo no array e passar a string procurada.
const fruits: string[] = ['maçã', 'banana', 'laranja', 'kiwi'];const searchTerm: string = 'banana';
if (fruits.includes(searchTerm)) { console.log('Fruta encontrada! 🍌');} else { console.log('Essa fruta não existe.');}Vantagens:
- Código extremamente legível — fica claro imediatamente o que está sendo feito.
- Retorna
boolean— ideal para condições. - Suporta a tipagem estrita do TypeScript.
Desvantagens:
- Busca linear O(n) — para arrays enormes (dezenas de milhares de elementos) pode ser lento.
- Não funciona com
NaN(mas isso é raro para strings).
Para 90% das tarefas, includes() é a sua escolha. Simples, confiável, rápido.
Método indexOf(): antigo, mas testado
Antes do includes(), todos usavam indexOf(). Ele também retorna o índice do elemento, mas se o elemento não existir, retorna -1. A verificação de -1 se tornou um clássico.
const languages: string[] = ['JavaScript', 'TypeScript', 'Python', 'Go'];const target: string = 'TypeScript';
if (languages.indexOf(target) !== -1) { console.log('Linguagem encontrada!');} else { console.log('Linguagem não está na lista.');}Vantagens:
- Funciona em todos os ambientes, mesmo em navegadores antigos (se isso for importante).
- Permite obter a posição do elemento para ações posteriores.
Desvantagens:
- Menos legível — é preciso lembrar do
-1. - A mesma complexidade O(n).
- TypeScript pode reclamar de comparação implícita; é melhor especificar o tipo explicitamente.
Dica: se você não precisa do índice, use includes(). Mas conhecer indexOf() é útil — ele aparece em código legado.
Método find(): quando você precisa de mais do que apenas true/false
O método find() retorna o primeiro elemento que satisfaz a condição, ou undefined se nada for encontrado. É uma ferramenta poderosa quando você não está apenas procurando uma string, mas um objeto com um campo específico.
interface User { id: number; name: string;}
const users: User[] = [ { id: 1, name: 'Ana' }, { id: 2, name: 'Boris' }, { id: 3, name: 'Vitor' }];
const foundUser = users.find(user => user.name === 'Boris');
if (foundUser) { console.log(`Usuário encontrado: ${foundUser.name}`);}Para arrays simples de strings, find() é exagerado, mas se você precisa obter o próprio elemento ou verificar uma condição complexa, esta é a melhor escolha.
Desempenho: também O(n), mas um pouco mais lento que includes() devido à chamada de callback em cada iteração.
Otimização com Set: quando a velocidade é crítica
Se você verifica a presença de s