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"]));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);42 hello
A seguir: declarações condicionais — ramificando com base em um valor, igual em qualquer outra linguagem.