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);