O TypeScript oferece recursos avançados para tipos e polimorfismo, especialmente ao trabalhar com generics. Estes recursos proporcionam maior segurança ao tipar e flexibilidade em cenários de programação comuns.
Generics com Restrições
Em algumas situações, deseja-se permitir qualquer tipo com generics, mas ainda quer-se restringir os tipos possíveis com certas características. Essas restrições são definidas usando a cláusula extends
.
Exemplo:
Suponha que você queira uma função que retorne uma propriedade de um objeto, mas você quer garantir que a propriedade realmente exista no objeto.
function getPropriedade<T, K extends keyof T>(obj: T, chave: K): T[K] {
return obj[chave];
}
const pessoa = {
nome: "Ana",
idade: 25
};
// Uso válido
let nome: string = getPropriedade(pessoa, "nome");
// Erro! "altura" não é uma chave de pessoa.
// let altura: number = getPropriedade(pessoa, "altura");
Neste exemplo, K extends keyof T
garante que o segundo argumento seja uma chave do objeto fornecido como primeiro argumento.
Usando a palavra-chave keyof
A operação keyof
é uma operação de tipo que pega um tipo e produz uma string ou tipo numérico literal que representa as chaves desse tipo.
Exemplo:
interface Carro {
marca: string;
modelo: string;
ano: number;
}
type ChavesDoCarro = keyof Carro; // "marca" | "modelo" | "ano"
Aqui, ChavesDoCarro
é um tipo que pode ser "marca"
, "modelo"
ou "ano"
.
Usando keyof
com Generics:
keyof
é extremamente útil em conjunto com generics, especialmente quando se deseja garantir que a operação seja realizada com propriedades que existem em um objeto.
function setPropriedade<T>(obj: T, chave: keyof T, valor: T[keyof T]): T {
obj[chave] = valor;
return obj;
}
const carro: Carro = {
marca: "Toyota",
modelo: "Corolla",
ano: 2020
};
// Uso válido
setPropriedade(carro, "modelo", "Camry");
// Erro! "cor" não é uma chave de Carro.
// setPropriedade(carro, "cor", "Vermelho");
Conclusão
Polimorfismo e generics avançados em TypeScript ampliam as possibilidades de criar código reutilizável e ainda mantêm uma forte segurança de tipo. Com a combinação de generics restritos e a operação keyof
, é possível escrever funções genéricas precisas e seguras que operam em propriedades de objetos. Estes recursos tornam o TypeScript uma ferramenta poderosa para desenvolvimento, combinando flexibilidade com segurança de tipo.
Top comments (0)