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.