Entrevistas de TypeScript testam se você entende o sistema de tipos, além da sintaxe. Abaixo estão 20 perguntas com respostas, do básico até as que separam quem usa TypeScript de quem sabe por que ele funciona. O código foi compilado com o compilador do TypeScript em modo strict antes da publicação, e as mensagens de erro citadas são as reais.
Fundamentos
1. O que o TypeScript adiciona ao JavaScript?
Um sistema de tipos estático que é verificado em tempo de compilação e depois apagado. A saída é JavaScript puro, então os tipos não têm custo nem presença em tempo de execução. Esse último ponto importa: você não consegue verificar um tipo com typeof em tempo de execução a menos que você mesmo escreva a verificação.
2. Qual é a diferença entre type e interface?
Ambos descrevem formatos de objeto e muitas vezes funcionam de forma intercambiável. As diferenças práticas:
| interface | type | |
|---|---|---|
| Fusão de declarações | Sim, duas declarações se fundem | Não, um nome duplicado é um erro |
| Uniões e primitivos | Não consegue expressá-los | Consegue expressá-los, como uma união de number e string |
| Extensão | extends | Interseção com & |
| Tipos mapeados e condicionais | Não | Sim |
Declarar interface A duas vezes funde os campos. Declarar type B duas vezes produz error TS2300: Duplicate identifier 'B'. Uma regra prática comum: use interface para formatos de objeto públicos que outros podem estender, e type para todo o resto.
3. Qual é a diferença entre any, unknown e never?
- any desliga a verificação. Vale tudo, e os erros ficam escondidos.
- unknown é a versão segura. Você pode atribuir qualquer coisa a ele, mas precisa estreitá-lo antes de usar. Chamar x.toFixed() em um unknown falha com error TS18046: 'x' is of type 'unknown'.
- never é o tipo de valores que não podem existir, como uma função que sempre lança uma exceção. É útil para verificações exaustivas.
Prefira unknown a any para valores cujo tipo você não controla, como JSON parseado.
4. O que o modo strict faz?
Ele ativa um grupo de verificações, sendo as mais importantes strictNullChecks (então null e undefined são tipos separados) e noImplicitAny. Com ele, usar um valor opcional sem verificar gera error TS18048: 'x' is possibly 'undefined'. Projetos novos devem começar com strict ativado.
5. Qual é a diferença entre readonly e const?
const impede que uma variável seja reatribuída. readonly impede que uma propriedade seja atribuída. Escrever em uma propriedade readonly gera error TS2540: Cannot assign to 'n' because it is a read-only property. Nenhum dos dois torna o objeto subjacente profundamente imutável.
Tipos na prática
6. O que são tipos de união e como você os estreita?
Uma união significa "um destes tipos". O estreitamento usa verificações que o compilador entende:
type Id = number | string;
function describe(id: Id): string {
if (typeof id === "string") return id.toUpperCase();
return id.toFixed(1);
}
Dentro do if, id é uma string. Depois dele, o compilador sabe que é um number. Outras ferramentas de estreitamento são instanceof, o operador in, verificações de igualdade e type guards personalizados.
7. O que é uma união discriminada?
Uma união em que cada membro tem um campo literal compartilhado, o discriminante, que os diferencia:
type Shape =
| { kind: "circle"; r: number }
| { kind: "sq"; s: number };
function assertNever(x: never): never {
throw new Error("unexpected " + x);
}
function area(s: Shape): number {
switch (s.kind) {
case "circle": return Math.PI * s.r ** 2;
case "sq": return s.s ** 2;
default: return assertNever(s);
}
}
Se você depois adicionar um novo formato e esquecer um case, o ramo default para de compilar, porque s não é mais never. Essa é uma verificação exaustiva.
8. O que são generics, e por que usá-los?
Eles permitem que uma função ou tipo funcione com muitos tipos mantendo a relação entre eles:
function first<T>(xs: T[]): T | undefined { return xs[0]; }
function pick<T, K extends keyof T>(o: T, k: K): T[K] { return o[k]; }
first([1, 2]) retorna number | undefined, não any. pick(user, "name") retorna o tipo de name. A restrição extends keyof T impede que você passe uma chave que não existe.
9. Quais são os utility types comuns?
| Utility | O que faz |
|---|---|
| Partial<T> | Torna toda propriedade opcional |
| Required<T> | Torna toda propriedade obrigatória |
| Readonly<T> | Torna toda propriedade readonly |
| Pick<T, K> | Mantém apenas as chaves listadas |
| Omit<T, K> | Remove as chaves listadas |
| Record<K, V> | Um tipo de objeto com chaves K e valores V |
| ReturnType<F> | O tipo de retorno de um tipo de função |
10. O que são tipos mapeados?
Eles constroem um novo tipo percorrendo as chaves de outro. O próprio Partial é escrito como { [K in keyof T]?: T[K] }. Saber disso mostra que você entende os utility types em vez de decorá-los.
11. O que é as const?
Ele diz ao compilador para inferir o tipo mais estreito e marcar tudo como readonly. const arr = [1, 2, 3] as const tem o tipo readonly [1, 2, 3], e arr.push(4) falha com error TS2339: Property 'push' does not exist on type 'readonly [1, 2, 3]'. É útil para listas de valores permitidos e para objetos de configuração.
12. O que é uma asserção de tipo, e quando ela é perigosa?
value as Type diz ao compilador para confiar em você. Ela não realiza nenhuma verificação em tempo de execução. Se você estiver errado, o erro aparece depois como um crash. Prefira estreitar com uma verificação, ou uma função type guard, em vez de assertar.
Comportamento da linguagem
13. Qual é a diferença entre null e undefined?
undefined significa que um valor nunca foi atribuído, e null significa "nenhum valor" definido de propósito. Com strictNullChecks, eles são tipos separados. Use optional chaining (a?.b) e nullish coalescing (a ?? b) para lidar com eles. Diferente do ||, o ?? só usa o valor padrão para null e undefined, então 0 e a string vazia são mantidos.
14. O que é a asserção non-null !?
value! diz ao compilador que um valor não é null nem undefined. Assim como o as, ela não é verificada. Tudo bem usá-la em alguns casos em que você sabe mais que o compilador, mas uma verificação em tempo de execução costuma ser mais segura.
15. O que o keyof faz, e o que é typeof em posição de tipo?
keyof T produz a união dos nomes das propriedades de T. Em posição de tipo, typeof x pega o tipo de um valor, o que evita repeti-lo. Juntos, keyof typeof obj dá as chaves de um objeto que você definiu como valor.
16. Como os enums se comparam com os union types?
Enums criam um objeto e valores em tempo de execução. Uma união de string literals, como "idle" | "loading", é apagada em tempo de compilação e não precisa de código extra. Muitos times preferem uniões de string literals pela simplicidade e usam enums quando precisam do objeto em tempo de execução.
Ferramentas e projetos reais
17. O que o tsconfig.json faz, e quais opções importam?
Ele diz ao compilador quais arquivos incluir e como verificá-los. Opções que os entrevistadores perguntam: strict, target (a versão de JavaScript a ser gerada), module e moduleResolution, noEmit (apenas verificar, o que é comum quando outra ferramenta faz o build), esModuleInterop e skipLibCheck.
18. Como você tipa algo que vem de fora, como uma resposta de API?
Os tipos somem em tempo de execução, então o compilador não consegue verificar o que a rede retorna. Trate os dados como unknown e valide-os com uma biblioteca de schema ou um type guard escrito à mão antes de usá-los. Afirmar um tipo em um JSON já parseado esconde bugs.
19. Como você migra um projeto JavaScript para TypeScript?
Faça isso gradualmente. Adicione um tsconfig.json com allowJs, renomeie os arquivos um de cada vez, ative opções mais rígidas com o tempo e adicione tipos primeiro nas fronteiras, como clients de API e utilitários compartilhados. Evite uma reescrita de uma vez só.
20. O que é tipagem estrutural?
O TypeScript compara tipos pela forma, não pelo nome. Se um objeto tem os campos que um tipo exige, ele é aceito, mesmo que nunca tenha sido declarado como aquele tipo. É diferente de linguagens que usam tipagem nominal, em que o nome declarado importa.
Como se preparar
- Abra um playground ou um projeto pequeno em modo strict e teste cada exemplo acima, incluindo os que devem falhar.
- Esteja pronto para escrever uma função genérica e uma união discriminada de memória.
- Saiba por que você escolheria unknown em vez de any.
- Prepare uma história sobre como você tipou algo complicado em um projeto real.
Para praticar mais, veja nossos guias de perguntas de entrevista sobre Node.js, perguntas de entrevista sobre Angular e perguntas de entrevista sobre Python.
Pratique em voz alta e com suas próprias palavras. Uma transcrição depois mostra onde você se perdeu ou pulou o ponto principal. Siga as regras da empresa sobre ferramentas de IA em qualquer entrevista ao vivo ou avaliação.
Pratique suas respostas com YesToTheOffer
Ensaiar em voz alta, obter respostas construídas a partir do seu próprio currículo e revisar sua transcrição depois. 30 minutos grátis, sem assinatura.



