Como passar em uma entrevista de TypeScript: principais perguntas de nível avançado
\n\nUma entrevista para uma posição de Desenvolvedor Senior Frontend ou Fullstack raramente ocorre sem perguntas aprofundadas sobre TypeScript. Se você já conhece bem os tipos e interfaces básicos, para passar em uma technical interview de alto nível, é necessário entender o sistema de tipos avançado. Neste artigo, reunimos as 5 principais perguntas e desafios frequentemente feitos em entrevistas de TypeScript de nível avançado. Cada item é acompanhado de análise e exemplos de código.
\n\n1. Tipos Condicionais (Conditional Types) e a palavra-chave infer
\n\nTipos condicionais permitem criar tipos que dependem de uma condição. Em combinação com infer, você pode "extrair" partes de tipos, como em Pattern Matching.
Pergunta: Escreva o tipo ReturnType (sem usar o embutido).
Análise: Usamos um tipo condicional com infer para capturar o valor de retorno de uma função.
type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;\n\n// Exemplo de uso\nfunction greet(name: string): string {\n return `Hello, ${name}`;\n}\n\ntype GreetReturn = MyReturnType<typeof greet>; // string\n\nComo responder na entrevista: Explique que infer R cria uma nova variável de tipo R, que captura o tipo de retorno da assinatura da função. Se a condição não for atendida (não for passada uma função), o tipo se torna never.
2. Mapped Types (Tipos Mapeados) e modificadores
\n\nMapped types permitem criar novos tipos transformando propriedades de um existente. O nível avançado envolve trabalhar com os modificadores +, -, as e chaves via keyof.
Pergunta: Crie o tipo DeepReadonly, que torna todas as propriedades de um objeto (incluindo as aninhadas) readonly.
type DeepReadonly<T> = {\n readonly [K in keyof T]: T[K] extends Record<string, unknown> \n ? DeepReadonly<T[K]> \n : T[K];\n};\n\ninterface User {\n name: string;\n address: {\n city: string;\n zip: number;\n };\n}\n\ntype ReadonlyUser = DeepReadonly<User>;\n// Todas as propriedades se tornaram readonly, incluindo address.city\n\nComo responder: Mostre a chamada recursiva de DeepReadonly para objetos aninhados. Explique como Record<string, unknown> é usado para verificar se o valor é um objeto.
3. Template Literal Types (Tipos de Literais de Template)
\n\nTemplate literal types permitem manipular tipos de string em tempo de compilação. Esta é uma ferramenta poderosa para criar APIs estritas.
\n\nPergunta: Implemente o tipo EventName, que recebe uma string e retorna o tipo "on{String}" com Capitalize correto.
type EventName<T extends string> = `on${Capitalize<T>}`;\n\ntype ClickEvent = EventName<'click'>; // "onClick"\ntype FocusEvent = EventName<'focus'>; // "onFocus"\n\n// Exemplo avançado: extração de string\ntype ExtractAction<T extends string> = \n T extends `on${infer Action}` ? Uncapitalize<Action> : never;\n\ntype Action = ExtractAction<'onSubmit'>; // "submit"\n\nComo responder: Observe os tipos embutidos Capitalize e Uncapitalize. Mostre como infer funciona dentro de literais de template para fazer parsing de strings.
4. Genéricos com restrições e tuplas variádicas (Variadic Tuple Types)
\n\nVariadic tuple types (introduzidos no TS 4.0) permitem trabalhar com tuplas de comprimento arbitrário. Isso é indispensável ao criar funções type-safe com número variável de argumentos.
\n\nPergunta: Escreva um tipo para a função
Blogs
Book Recommendations
Leia também
Autenticação segura em JavaScript: como não vazar senhas
Inserção de elemento em um array por índice: como funciona por baixo dos panos em JS
Programação Assíncrona em C#: guia completo com exemplos
Como chamar código Objective-C a partir de Swift: a amizade das linguagens no iOS
Concorrência e Multithreading em C#: Nível Avançado