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); } Espero que JSDoc pueda inferir el tipo de cada one y two en este fragmento:
const one = map('123', parseInt); // should be `number` const two = map('123'); // should be `string` Desafortunadamente, parece que, cuando no se proporciona la función de mapper opcional, el tipo resultante no se infiere y se supone que two es any , como se ilustra a continuación:
Tenía la esperanza de que documentar el parámetro del mapper de mi función de map fuera opcional y tuviera un valor predeterminado (como se documenta aquí sería suficiente).
¿Qué me estoy perdiendo? ¡Seguro que debe ser posible!
La implementación adecuada de la inferencia de tipo JSDoc para la función de map es...
/** * @template T * @template [U = T] * @param { T } item * @param { function(T): U } [mapper = t => t] * @returns { U } */ function map(item, mapper = t => t) { return mapper(item); } La única diferencia está en la declaración de la plantilla de tipo de retorno U :
/** @template U */... necesita convertirse en:
/** @template [U = T] */ Esto le permite a su sistema de inferencia de tipos comprender que el tipo genérico U , cuando no se puede inferir, debería ser equivalente por defecto a T .
Esto parece estar documentado solo en la referencia de TypeScript JSDoc . Parece funcionar, como se ilustra a continuación: