Cómo generar JSDoc para la función `pipe`d ES6

10

Tengo una función de estilo ES6 que se define usando la composición de funciones con asyncPipe.

import { getItemAsync } from 'expo-secure-store';

const asyncPipe = (...fns) => x => fns.reduce(async (y, f) => f(await y), x);

const getToken = () => getItemAsync('token');

const liftedGetToken = async ({ ...rest }) => ({
  token: await getToken(),
  ...rest,
});

const liftedFetch = ({ body, route, token, method = 'GET' } = {}) =>
  fetch(route, {
    ...(body && { body: JSON.stringify(body) }),
    headers: {
      'Content-Type': 'application/json',
      ...(token && { Authorization: `Bearer ${token}` }),
    },
    method,
  });

const json = res => res.json();

/**
 * @method
 * @param {Object} fetchSettings the settings for the fetch request
 * @param {Object} fetchSettings.body the body of the request
 * @param {string} fetchSettings.route the URL of the request
 * @param {string} fetchSettings.method the method of the request
 * @param {string} fetchSettings.token should only be used for testing and unauthenticated requests
 */
const request = asyncPipe(liftedGetToken, liftedFetch, json);

Como puede ver, traté de agregarle una descripción JSDoc. Pero cuando lo uso en cualquier lugar, mi editor, VSCode, no sugiere sus parámetros. ¿Cómo declaras este tipo de funciones con JSDoc? ¿Y cómo obtengo parámetros para que esta función funcione con Intellisense?

J. Hesters
fuente

Respuestas:

1

VSCode usa el motor TypeScript bajo el capó, que no es bueno para inferir tipos de composiciones de funciones y, como ha visto, no reconoce una composición sin puntos como una declaración de función.

Si desea sugerencias de tipo, puede especificar los argumentos para la función compuesta envolviendo una función puntiaguda a su alrededor.

Escribiría algo como esto: nota: los valores predeterminados hacen que el JSDoc sea innecesario para sugerencias de tipo, pero de todos modos es posible que desee mantener el JSDoc para las descripciones. También asegúrese de que las fallas causadas por las fallas de valor predeterminadas produzcan mensajes de error adecuados.

/**
  * http request with JSON parsing and token management.
  * @param {Object} fetchSettings the settings for the fetch request
  * @param {Object} fetchSettings.body the body of the request
  * @param {string} fetchSettings.route the URL of the request
  * @param {string} fetchSettings.method the method of the request
  * @param {string} fetchSettings.token should only be used for testing and unauthenticated requests
  */
const request = ({
  body = {},
  route = '',
  method = 'GET',
  token = ''
}) => asyncPipe(liftedGetToken, liftedFetch, json)({
  body, route, method, token
});
Eric Elliott
fuente
6

VSCode intentará mostrar el comentario de la función anónima dentro asyncPipe. Si agrega un comentario JSDoc dentro de él, puede ver el comportamiento:

const asyncPipe = (...fns) =>
  /**
   * My asyncPipe description
   * @param {Object} x Any object
   */
  x => fns.reduce(async (y, f) => f(await y), x);

const request = asyncPipe(liftedGetToken, liftedFetch, json);

ejemplo

Lamentablemente, en JSDoc no hay forma de anular la documentación de la función anónima como intentaba hacer. Sin embargo, podría forzar su intento de VSCode de esta manera, tenga en cuenta que esto introduce una llamada de función adicional:

const doRequest = asyncPipe(liftedGetToken, liftedFetch, json);

/**
 * @method
 * @param {Object} fetchSettings the settings for the fetch request
 * @param {Object} fetchSettings.body the body of the request
 * @param {string} fetchSettings.route the URL of the request
 * @param {string} fetchSettings.method the method of the request
 * @param {string} fetchSettings.token should only be used for testing and unauthenticated requests
 */
const request = fetchSettings => doRequest(fetchSettings);

ejemplo de solución

A1rPun
fuente