🥇 Funciones, recomendaciones al escribir generics

🍿 Guia para escribir buenas funciones genéricas

Al escribir funciones genéricas es importante no utilizar generics en donde no sean necesarios, debido a que esto puede interferir con el mantener una función sencilla de utilizar e interpretar.

🥤 Favorece la inferencia sobre la declaración de los tipos de los argumentos

Aquí hay dos funciones que operan igual.

function primerElemento<Type>(arr: Type[]) {
    return arr[0];
}

function primerElemento<Type extends any[]>(arr: Type[]) {
    return arr[0];
}

Ambas funciones realizan el mismo trabajo y ambas funciones infieren el tipo del return, sin embargo para la primera función el Type sera el tipo provisto como argumento a la función mientras que en la segunda el Type es any que es mucho mas generalista.

🥤 Utiliza pocos parámetros

Aquí hay otras dos funciones.

function filtrar1<Type>(arr: Type[], func: (arg: Type) => boolean): Type[] {
    return arr.filter(func);
}

function filtrar2<Type, Func extends (arg: Type) => boolean>(
    arr: Type[],
    func: Func
): Type[] {
    return arr.filter(func);
}

En este ejemplo tenemos dos funciones que realizan la misma tarea, pero en el segundo ejemplo Func no relaciona al menos dos valores, solo hace mas complicado de leer la función y no existe una razón valida para ello.

🥤 El parámetro Type debe aparecer al menos dos veces

En algunas ocasiones olvidamos que una función no requiere siempre utilizar generics.

function saludar(Type extends string)(s: Type) {
    console.log("Hola " + s);
}

La función anterior puede ser escrita fácilmente en una forma mas simple.

function saludar(s: string) {
    console.log("Hola " + s);
}

Intenta recordar siempre que si implementas generics es porque deseas relacionar valores. Si un parámetro es utilizado solamente en una ocasión, no requiere que eches uso de esta característica.