Fácil TypeScript
Acessando propriedade com segurança
Enunciado
Crie uma função genérica pluck que recebe um objeto e uma chave, e retorna o valor dessa chave. Use K extends keyof T para garantir que a chave existe no objeto.
Requisitos
- A função deve se chamar
plucke ter dois parâmetros genéricos:TeK extends keyof T. - O retorno deve ser do tipo
T[K]. - O código deve compilar sem erros e imprimir o valor correto.
Código inicial
// Complete a função pluck
function pluck<T, K extends keyof T>(obj: T, key: K): T[K] {
// Seu código aqui
}
const carro = { marca: "Fiat", ano: 2020, eletrico: false };
console.log(pluck(carro, "marca")); // Fiat
Saída esperada
Fiat
Ver dica
Dentro da função, retorne obj[key]. O tipo de retorno já está anotado como T[K].
Mostrar solução
// Função pluck: acessa uma propriedade de um objeto de forma segura.
function pluck<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key]; // TypeScript sabe que key existe em T e retorna T[K]
}
const carro = { marca: "Fiat", ano: 2020, eletrico: false };
console.log(pluck(carro, "marca")); // Fiat
Passo a passo
- Declaramos a função
pluckcom dois parâmetros genéricos:T(o tipo do objeto) eK(a chave). - A constraint
K extends keyof Tgarante queKsó pode ser uma das chaves deT. - O parâmetro
objé do tipoT, ekeyé do tipoK. - O retorno é anotado como
T[K], o tipo do valor da propriedadeKemT. - Dentro da função,
obj[key]é seguro porqueKé uma chave válida deT. - Chamamos
pluck(carro, "marca")e imprimimos o resultado.
Por que funciona
A constraint K extends keyof T impede que passemos uma chave inexistente. O acesso indexado T[K] informa ao compilador o tipo exato do valor retornado, permitindo inferência precisa.
Erros comuns
- Tentar acessar
obj[key]sem a constraint: o TypeScript reclamaria quekeynão pode ser usada para indexarT. - Passar uma chave que não existe:
pluck(carro, "cor")gera erro de compilação.
Outra forma de resolver
Poderia usar Object.values ou Reflect.get, mas perderia a tipagem forte. A solução com genéricos é preferível.
Saída esperada
Fiat