The Codest
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Indústrias
    • Fintech e Banca
    • E-commerce
    • Adtech
    • Tecnologia da saúde
    • Fabrico
    • Logística
    • Automóvel
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
Seta para trás VOLTAR
2020-05-26
Desenvolvimento de software

Genéricos em TypeScript

Mateusz Staniuk

Os genéricos fornecem partes reutilizáveis de código que funcionam com vários tipos em vez de um único tipo. Os genéricos permitem tratar o tipo como uma variável e especificá-lo aquando da sua utilização, à semelhança dos parâmetros das funções.

Os genéricos podem ser utilizados em conjunto com funções (criando uma função genérica), classes (criando uma classe genérica) e interfaces (criando uma interface genérica).

Utilização básica

Provavelmente já utilizou genéricos no passado, mesmo sem o saber - a utilização mais comum dos genéricos é declarar uma matriz:

const myArray: string[];

Não é muito especial à primeira vista, apenas declaramos minhaVariedade como um array de strings, mas é o mesmo que uma declaração genérica:

const myArray: Array;

Manter as coisas explícitas

Vamos começar com um exemplo muito simples - como poderíamos portar esta função JS para TypeScript:

function getPrefiledArray(filler, length) {
    return (new Array(length)).fill(filler);
}

Esta função devolverá uma matriz preenchida com uma determinada quantidade de enchimento, portanto comprimento será número e toda a função devolverá uma matriz de enchimento - mas o que é um enchimento? Nesta altura, pode ser qualquer coisa, por isso uma opção é utilizar qualquer:

function getPrefiledArray(filler: any, length: number): any[] {
    return (new Array(length)).fill(filler);
}

Utilizar qualquer é certamente genérico - podemos passar literalmente qualquer coisa, por isso "trabalhar com um número de tipos em vez de um único tipo" da definição está totalmente coberto, mas perdemos a ligação entre enchimento e o tipo de retorno. Neste caso, queremos devolver uma coisa comum, e podemos definir explicitamente esta coisa comum como parâmetro de tipo:

function getPrefiledArray(filler: T, length: number): T[] {
    return (new Array(length)).fill(filler);
}

e utilizar desta forma:

const prefilledArray = getPrefiledArray(0, 10);

Restrições genéricas

Vejamos outros casos, provavelmente mais comuns. Porque é que usamos tipos em funções? Para mim, é para garantir que os argumentos passados para a função têm algumas propriedades com as quais quero interagir.

Mais uma vez vamos tentar portar uma função simples do JS para o TS.

function getLength(thing) {
    return thing.length;
}

Temos um enigma não trivial - como garantir que a coisa tem um comprimento e o primeiro pensamento pode ser fazer algo do género:

function getLength(thing: typeof Array):number {
    return thing.length;
}

e, dependendo do contexto, pode estar correto, mas em geral somos um pouco genéricos - funciona com matrizes de vários tipos, mas e se não soubermos se a coisa deve ser sempre uma matriz - talvez a coisa seja um campo de futebol ou uma casca de banana? Neste caso, temos de reunir as propriedades comuns dessa coisa numa construção que possa definir as propriedades de um objeto - uma interface:

interface IThingWithLength {
  comprimento: número;
}

Podemos utilizar IThingWithLength como tipo da interface coisa parâmetro:

function getLength(thing: IThingWithLength):number {
    return thing.length;
}

francamente, neste exemplo simples, não haverá problema algum, mas se quisermos manter este tipo genérico e não enfrentar o problema do primeiro exemplo, podemos usar Restrições genéricas:

function getLength(thing: T):number {
    return thing.length;
}

e utilizá-lo:

interface IBananaPeel {
  espessura: número;
  comprimento: número;
}

const bananaPeel: IBananaPeel = {thickness: 0.2, length: 3.14};
getLength(bananaPeel);

Utilizar estende-se garante que T conterá propriedades que são definidas por IThingWithLength.

Classes genéricas

Até agora, estávamos a trabalhar com funções genéricas, mas não é o único sítio onde os genéricos brilham, vamos ver como os podemos incorporar nas classes.

Em primeiro lugar, vamos tentar guardar um cacho de bananas no cesto das bananas:

classe Banana {
  construtor(
    public comprimento: número,
    public cor: string,
    public ionizingRadiation: number
  ) {}
}

class BananaBasket {
  private bananas: Banana[] = [];

  add(banana: Banana): void {
    this.bananas.push(banana);
  }
}

const bananaBasket = new BananaBasket();
bananaBasket.add(new Banana(3.14, 'red', 10e-7));

Agora vamos tentar criar um cesto de uso geral, para coisas diferentes com o mesmo tipo:

class Basket {
  private stuff: T[] = [];

  add(thing: T): void {
    this.stuff.push(thing);
  }
}

const bananaBasket = new Basket();

E, por último, vamos supor que o nosso cesto é um contentor de material radioativo e que só podemos armazenar matéria que tenha radiação ionizante propriedade:

interface IRadioactiva {
  ionizingRadiation: número;
}

class RadioactiveContainer {
  private stuff: T[] = [];

  add(thing: T): void {
    this.stuff.push(thing);
  }
}

Interface genérica

Por fim, vamos tentar reunir todos os nossos conhecimentos e construir um império radioativo utilizando também Interfaces Genéricas:

// Definir atributos comuns para os contentores
interface IRadioactive {
  ionizingRadiation: number;
}


// Definir algo que é radioativo
interface IBanana extends IRadioactive {
  comprimento: número;
  cor: string;
}

// Definir algo que não é radioativo
interface IDog {
  peso: número;
}

// Definir interface para um contentor que só pode conter coisas radioactivas
interface IRadioactiveContainer {
  add(thing: T): void;
  getRadioactiveness():number;
}

// Definir a classe que implementa a interface do contentor radioativo
class RadioactiveContainer implements IRadioactiveContainer {
  private stuff: T[] = [];

  add(thing: T): void {
    this.stuff.push(thing);
  }

  getRadioactiveness(): número {
      return this.stuff.reduce((a, b) => a + b.ionizingRadiation, 0)
  }
}

// ERRO! O tipo 'IDog' não satisfaz a restrição 'IRadioactive'
// E é um pouco brutal guardar cães dentro de um contentor radioativo
const dogsContainer = new RadioactiveContainer();

// Tudo bem, amigo!
const radioactiveContainer = new RadioactiveContainer();

// Lembra-te de separar os teus resíduos radioactivos - cria um contentor separado só para bananas
const bananasContainer = new RadioactiveContainer();

É tudo, pessoal!

Artigos relacionados

Ilustração de uma aplicação de cuidados de saúde para smartphone com um ícone de coração e um gráfico de saúde em ascensão, com o logótipo The Codest, representando soluções digitais de saúde e HealthTech.
Desenvolvimento de software

Softwares para o setor de saúde: Tipos, casos de uso

As ferramentas em que as organizações de cuidados de saúde confiam atualmente não se assemelham em nada às fichas de papel de há décadas atrás. O software de cuidados de saúde apoia agora os sistemas de saúde, os cuidados aos doentes e a prestação de cuidados de saúde modernos em...

OCODEST
Ilustração abstrata de um gráfico de barras em declínio com uma seta ascendente e uma moeda de ouro que simboliza a eficiência ou a poupança de custos. O logótipo The Codest aparece no canto superior esquerdo com o slogan "In Code We Trust" sobre um fundo cinzento claro
Desenvolvimento de software

Como dimensionar a sua equipa de desenvolvimento sem perder a qualidade do produto

Aumentar a sua equipa de desenvolvimento? Saiba como crescer sem sacrificar a qualidade do produto. Este guia cobre sinais de que é hora de escalar, estrutura da equipe, contratação, liderança e ferramentas - além de como o The Codest pode...

OCODEST
Desenvolvimento de software

Construir aplicações Web preparadas para o futuro: ideias da equipa de especialistas do The Codest

Descubra como o The Codest se destaca na criação de aplicações web escaláveis e interactivas com tecnologias de ponta, proporcionando experiências de utilizador perfeitas em todas as plataformas. Saiba como a nossa experiência impulsiona a transformação digital e o negócio...

OCODEST
Desenvolvimento de software

As 10 principais empresas de desenvolvimento de software sediadas na Letónia

Saiba mais sobre as principais empresas de desenvolvimento de software da Letónia e as suas soluções inovadoras no nosso último artigo. Descubra como estes líderes tecnológicos podem ajudar a elevar o seu negócio.

thecodest
Soluções para empresas e escalas

Fundamentos do desenvolvimento de software Java: Um Guia para Terceirizar com Sucesso

Explore este guia essencial sobre o desenvolvimento de software Java outsourcing com sucesso para aumentar a eficiência, aceder a conhecimentos especializados e impulsionar o sucesso do projeto com The Codest.

thecodest

Subscreva a nossa base de conhecimentos e mantenha-se atualizado sobre os conhecimentos do sector das TI.

    Sobre nós

    The Codest - Empresa internacional de desenvolvimento de software com centros tecnológicos na Polónia.

    Reino Unido - Sede

    • Office 303B, 182-184 High Street North E6 2JA
      Londres, Inglaterra

    Polónia - Pólos tecnológicos locais

    • Parque de escritórios Fabryczna, Aleja
      Pokoju 18, 31-564 Cracóvia
    • Embaixada do Cérebro, Konstruktorska
      11, 02-673 Varsóvia, Polónia

      The Codest

    • Início
    • Sobre nós
    • Serviços
    • Case Studies
    • Saber como
    • Carreiras
    • Dicionário

      Serviços

    • Aconselhamento
    • Desenvolvimento de software
    • Desenvolvimento backend
    • Desenvolvimento de front-end
    • Staff Augmentation
    • Programadores de back-end
    • Engenheiros de nuvem
    • Engenheiros de dados
    • Outros
    • Engenheiros de GQ

      Recursos

    • Factos e mitos sobre a cooperação com um parceiro externo de desenvolvimento de software
    • Dos EUA para a Europa: Porque é que as empresas americanas decidem mudar-se para a Europa?
    • Comparação dos centros de desenvolvimento da Tech Offshore: Tech Offshore Europa (Polónia), ASEAN (Filipinas), Eurásia (Turquia)
    • Quais são os principais desafios dos CTOs e dos CIOs?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Direitos de autor © 2026 por The Codest. Todos os direitos reservados.

    pt_PTPortuguese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek cs_CZCzech pt_PTPortuguese