es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

JSDoc hints

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!

Tags:  , , ,

Answer

  1. Avatar for 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:

    /**
     * @template T
     * @template U
     * @param { T } item
     * @param { function(T): U } [mapper = /** @type {function(T): U} */ (t => t)]
     * @returns { U }
     */
    function map(item, mapper = t => t) {
      return mapper(item);
    }
    

    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’.

Comments are closed.