Як генерувати JSDoc для функції `pipe`d ES6


10

У мене функція у стилі ES6, яка визначена за допомогою складу функції з 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);

Як ви бачите, я спробував додати до нього опис JSDoc. Але коли я використовую його де завгодно, мій редактор VSCode не пропонує його параметрів. Як ви декларуєте такі функції з JSDoc? І як я можу отримати парами для цієї функції для роботи з Intellisense?


Відповіді:


1

VSCode використовує двигун TypeScript під кришкою, що непогано виводить типи з функціональних композицій, і, як ви вже бачили, не визнає безточкову композицію як декларацію функції.

Якщо ви хочете ввести підказки, ви можете вказати аргументи складеної функції, обернувши навколо неї загострену функцію.

Я б написав це приблизно так - зауважте: значення за замовчуванням роблять JSDoc непотрібним для підказки типу, але ви, можливо, хочете зберегти JSDoc для описів. Також переконайтесь, що збої, спричинені зменшенням значень за замовчуванням, призводять до адекватного повідомлення про помилки.

/**
  * 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
});

6

VSCode спробує відобразити коментар анонімної функції всередині asyncPipe. Якщо ви додасте коментар JSDoc всередині нього, ви можете побачити поведінку:

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

приклад

На жаль, в JSDoc немає можливості змінити документацію анонімної функції, як ви намагалися зробити. Однак ви можете змусити свій намір зробити VSCode таким чином, зауважте, що це вводить додатковий виклик функції:

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

приклад рішення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.