DEV Community

Cover image for Polimorfismo e Generics Avançados em TypeScript
Levy Henrique Alves Nunes
Levy Henrique Alves Nunes

Posted on

Polimorfismo e Generics Avançados em TypeScript

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");
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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)