Como passar em uma entrevista de TypeScript: principais perguntas de nível avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como passar em uma entrevista de TypeScript: principais perguntas de nível avançado

\n\n

Uma 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\n

1. Tipos Condicionais (Conditional Types) e a palavra-chave infer

\n\n

Tipos 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.

\n\n

Pergunta: Escreva o tipo ReturnType (sem usar o embutido).

\n\n

Análise: Usamos um tipo condicional com infer para capturar o valor de retorno de uma função.

\n\n
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\n

Como 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.

\n\n

2. Mapped Types (Tipos Mapeados) e modificadores

\n\n

Mapped 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.

\n\n

Pergunta: Crie o tipo DeepReadonly, que torna todas as propriedades de um objeto (incluindo as aninhadas) readonly.

\n\n
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\n

Como responder: Mostre a chamada recursiva de DeepReadonly para objetos aninhados. Explique como Record<string, unknown> é usado para verificar se o valor é um objeto.

\n\n

3. Template Literal Types (Tipos de Literais de Template)

\n\n

Template literal types permitem manipular tipos de string em tempo de compilação. Esta é uma ferramenta poderosa para criar APIs estritas.

\n\n

Pergunta: Implemente o tipo EventName, que recebe uma string e retorna o tipo "on{String}" com Capitalize correto.

\n\n
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\n

Como responder: Observe os tipos embutidos Capitalize e Uncapitalize. Mostre como infer funciona dentro de literais de template para fazer parsing de strings.

\n\n

4. Genéricos com restrições e tuplas variádicas (Variadic Tuple Types)

\n\n

Variadic 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\n

Pergunta: Escreva um tipo para a função

Blogs

Book Recommendations