AnyCompiler

Generics

Uma função genérica trabalha com um tipo que é decidido quando a função é chamada, não quando é definida. É a forma como o TypeScript expressa "isso funciona da mesma forma independente do tipo" — uma função que inverte um array não deveria precisar de uma versão separada para strings e numbers.

function firstElement<T>(items: T[]): T {
  return items[0];
}

console.log(firstElement([1, 2, 3]));
console.log(firstElement(["a", "b", "c"]));
Output
1
a

T é um espaço reservado — o TypeScript o preenche com o tipo que você realmente passar, e o tipo de retorno fica travado para corresponder. Sabe-se que firstElement([1, 2, 3]) retorna um number; sabe-se que firstElement(["a", "b"]) retorna um string.

Interfaces genéricas

Interfaces também podem ser genéricas — útil para um formato como "uma caixa contendo algum valor", onde o tipo do valor varia.

interface Box<T> {
  value: T;
}

let numberBox: Box<number> = { value: 42 };
let stringBox: Box<string> = { value: "hello" };

console.log(numberBox.value, stringBox.value);
Output
42 hello

A seguir: declarações condicionais — ramificando com base em um valor, igual em qualquer outra linguagem.