Generics com `extends` (constraints)
Pergunta
Para que serve `<T extends ...>` num generic de TypeScript? Dê um exemplo de por que a constraint importa.
Resposta esperada
Sem constraint, um `<T>` é totalmente desconhecido — dentro da função você não pode acessar nenhuma propriedade de um valor `T` porque ele poderia ser qualquer coisa. `<T extends { id: string }>` diz 'T é algum tipo que TEM PELO MENOS um `id: string`', então dentro você pode ler `x.id` com segurança, e o chamador ainda passa o tipo concreto dele (não perde os outros campos). Exemplo clássico: `function pluck<T, K extends keyof T>(obj: T, chave: K): T[K]` — `K extends keyof T` garante que `chave` só pode ser uma chave real de `obj`, e o retorno `T[K]` é o tipo exato daquele campo. Sem a constraint `K extends keyof T`, você aceitaria qualquer string e perderia a checagem e o tipo de retorno preciso. Constraints são como você mantém o generic flexível SEM abrir mão de saber algo sobre o tipo.
Por que perguntam isso
Pergunta pleno de TS. O exemplo `keyof` é o teste padrão. Sinal bom: 'flexível sem abrir mão de saber algo sobre o tipo'.