Jak wygenerować JSDoc dla funkcji `pipe`d ES6

10

Mam funkcję w stylu ES6, która jest definiowana za pomocą kompozycji funkcji z 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);

Jak widać próbowałem dodać do niego opis JSDoc. Ale kiedy używam go w dowolnym miejscu, mój edytor, VSCode, nie sugeruje jego parametrów. Jak deklarujesz tego rodzaju funkcje za pomocą JSDoc? I jak uzyskać parametry tej funkcji do pracy z Intellisense?

J. Hesters
źródło

Odpowiedzi:

1

VSCode korzysta z mechanizmu TypeScript pod maską, który nie jest dobry w wywodzeniu typów z kompozycji funkcji, a jak widzieliście, nie rozpoznaje kompozycji bez punktów jako deklaracji funkcji.

Jeśli chcesz podpowiedzi typu, możesz podać argumenty dla funkcji złożonej, otaczając ją wskazaną funkcją.

Napisałbym to w ten sposób - uwaga: domyślne wartości sprawiają, że JSDoc nie jest potrzebny do podpowiedzi typu, ale możesz chcieć zachować JSDoc dla opisów. Upewnij się również, że awarie spowodowane przez awarie wartości domyślnych generują odpowiednie komunikaty o błędach.

/**
  * 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
źródło
6

VSCode spróbuje wyświetlić komentarz funkcji anonimowej w środku asyncPipe. Jeśli dodasz do niej komentarz JSDoc, zobaczysz zachowanie:

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);

przykład

Niestety w JSDoc nie ma możliwości zastąpienia dokumentacji funkcji anonimowej, tak jak próbowałaś to zrobić. Możesz jednak zmusić swój zamiar do VSCode w ten sposób, pamiętaj, że wprowadza to dodatkowe wywołanie funkcji:

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);

przykład rozwiązania

A1rPun
źródło