วิธีสร้าง 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);

ตัวอย่างการแก้ปัญหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.