「パイプ」されたES6関数のJSDocを生成する方法


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

ソリューションの例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.