Using Conditional Types
Tipos condicionais são expressões que contem generic type parameters que são usados para selecionar um novo tipo, como mostra a baixo uma condicional de tipo básica :
Os tipos condicionais tem um generic type parameter e uma expressão ternaria que seleciona um result type:

Um tipo condicional é um placeholder para um dos tipos dos possiveis resultados com base na condição, que senão escolhido o generic type parameter é usado o que permite a expressão ser usada usando um dos result types selecionados
No código, o tipo condicional resultType<T> é um placeholder para os tipos string e number, significa que o argumento para o generic type Tvai determinar o resultado da conditional type aplicada para qualquer que seja o valor, string ou number
O generic type parameter T é a restrição que é possivel somente aceitando boolean values e a expressão vai ser avaliada como true se o argumento provido para T é o tipo literal de valor true. O resultado é que resultType<T>retorna string quando T é true
O compilador resolve a conditional type e sabe que a type annotation para firstVal é string, permitindo um valor literal de string atribuido a firstVal. Quando o generic type argumenté falso a conditional retorna como number
O compilador enforça type safety com as conditional types. No final do statement do código a conditional type resolve para number mas é atribuido uma string value que produz o seguinte erro de compilação: