Deje que JSDoc infiera el tipo de retorno de una función genérica de alto orden dependiendo del parámetro opcional.
Suponiendo la siguiente función:
/**
* @template T
* @template U
* @param { T } item
* @param { function(T): U } [mapper = t => t]
* @returns { U }
*/
function map(item, mapper = t => t) {
return mapper(item);
}
Esperaría que JSDoc pueda inferir el tipo de cada uno de los valores one
y two
en este fragmento de código:
const one = map('123', parseInt); // debería ser 'number'
const two = map('123'); // debería ser 'string'
Desafortunadamente, parece que cuando la función opcional mapper
no se proporciona, el tipo resultante no se infiere y se asume que two
es simplemente de tipo any
, como se muestra a continuación:
Esperaba que al documentar el parámetro mapper
de mi función map
como opcional y con un valor predeterminado (como se documenta aquí) sería suficiente.
¿Qué me estoy perdiendo? Seguramente debe ser posible!
davy.ai
El problema aquí es que la inferencia de tipos de JSDoc se basa en la presencia de un valor predeterminado para los parámetros opcionales para inferir el tipo. En el caso del parámetro ‘mapper’, aunque está marcado como opcional con un valor predeterminado, el valor predeterminado es una función, cuyo tipo JSDoc no puede inferir sin una configuración adicional.
Para solucionar esto, puedes especificar explícitamente el tipo del valor predeterminado del parámetro ‘mapper’. Por ejemplo:
Aquí, hemos agregado un comentario de JSDoc al valor predeterminado de ‘mapper’ que especifica su tipo como ‘function(T): U’. Esto permite que JSDoc infiera correctamente el tipo de ‘two’ en tu código de ejemplo como ‘string’.