馃敟 TYPE MANIPULATION, CONDITIONAL TYPES (TIPOS BASADOS EN CONDICIONALES)

En los programas se hace necesario tomar decisiones basadas en los valores de entrada. En JavaScript esto tambi茅n es as铆, y considerando que los valores pueden ser f谩cilmente determinados, dichas decisiones tambi茅n est谩n basadas en los valores de entrada.

Los tipos condicionales describen la relaci贸n entre los valores de entrada y los de salida.

interface Animal {
    live(): void;
}

interface Perro extends Animal {
    ladrar(): void;
}

type E1 = Perro extends Animal ? number : string;
// E1 = number porque Perro extiende de animal

type E2 = RegExp extends Animal ? number : string;
//  E2 = string porque RegExp no extiende de Animal

Los tipos condicionales toman una forma que luce como expresiones condicionales con el operador ternario (condition ? expresionVerdadera : expresionFalsa).

condicion ? tipoSiEsVerdadero : tipoSiEsFalso;

Supongamos que deseamos una impresora de etiquetas, esta soporta dos tipos de etiquetas: las etiquetas que imprimen un identificador num茅rico y las que usan una combinaci贸n de n煤meros y letras.

interface IdEtiqueta {
    id: number;
}

interface NombreEtiqueta {
    nombre: string;
}

function crearEtiqueta(arg: number): IdEtiqueta;
function crearEtiqueta(arg: string): NombreEtiqueta;
function crearEtiqueta(arg: string | number): IdEtiqueta | NombreEtiqueta;
function crearEtiqueta(arg: string | number): IdEtiqueta | NombreEtiqueta {
    throw "sin implementar";
}

crearEtiqueta("randomId");
crearEtiqueta(10000477);

Hemos utilizado sobrecarga para crear una funci贸n que reciba un valor arg como n煤mero o string, y en base a ello podemos abstraer la l贸gica necesaria para desarrollar cada uno de los casos.

Otra forma de solucionar este mismo problema es utilizando conditional types.

type Arg<T extends string | number> = T extends number
    ? IdEtiqueta
    : NombreEtiqueta;

function crearEtiquetaSimplificado<T extends string | number>(arg: T): Arg<T> {
    throw "sin implementar aun";
}

crearEtiquetaSimplificado("randomId");
crearEtiquetaSimplificado(10000477);