Cara menghasilkan JSDoc untuk fungsi `pipe`d ES6

10

Saya memiliki fungsi gaya ES6 yang didefinisikan menggunakan komposisi fungsi dengan 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);

Seperti yang Anda lihat, saya mencoba menambahkan deskripsi JSDoc ke dalamnya. Tetapi ketika saya menggunakannya di mana saja editor saya, VSCode, tidak menyarankan parameternya. Bagaimana Anda mendeklarasikan fungsi semacam ini dengan JSDoc? Dan bagaimana cara agar params agar fungsi ini berfungsi dengan Intellisense?

J. Hesters
sumber

Jawaban:

1

VSCode menggunakan mesin TypeScript di bawah tenda, yang tidak baik dalam menyimpulkan jenis dari komposisi fungsi, dan seperti yang Anda lihat, tidak mengenali komposisi bebas-titik sebagai deklarasi fungsi.

Jika Anda ingin mengetikkan petunjuk, Anda bisa menentukan argumen untuk fungsi yang dikomposisikan dengan membungkus fungsi runcing di sekitarnya.

Saya akan menulisnya seperti ini - note: nilai default membuat JSDoc tidak perlu untuk tipe petunjuk, tetapi Anda mungkin ingin tetap menggunakan JSDoc untuk deskripsi. Pastikan juga bahwa kegagalan yang disebabkan oleh penurunan nilai default menghasilkan pesan kesalahan yang memadai.

/**
  * 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
sumber
6

VSCode akan mencoba untuk menampilkan komentar dari fungsi anonim di dalamnya asyncPipe. Jika Anda menambahkan komentar JSDoc di dalamnya, Anda dapat melihat perilaku:

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

contoh

Sayangnya tidak ada cara di JSDoc untuk mengganti dokumentasi fungsi anonim seperti yang Anda coba lakukan. Namun Anda dapat memaksakan niat Anda ke VSCode seperti ini, harap dicatat bahwa ini memperkenalkan panggilan fungsi tambahan:

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

contoh solusi

A1rPun
sumber