У меня есть функция в стиле 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?
Ответы:
VSCode использует движок TypeScript под капотом, который не очень хорошо выводит типы из композиций функций, и, как вы видели, не распознает бессмысленную композицию как объявление функции.
Если вам нужны подсказки типа, вы можете указать аргументы составной функции, обернув заостренную функцию вокруг нее.
Я написал бы что-то вроде этого - примечание: значения по умолчанию делают JSDoc ненужным для подсказок типов, но вы все равно можете сохранить JSDoc для описаний. Также убедитесь, что сбои, вызванные откатами по умолчанию, приводят к адекватному обмену сообщениями об ошибках.
источник
VSCode попытается отобразить комментарий анонимной функции внутри
asyncPipe
. Если вы добавите комментарий JSDoc в него, вы увидите поведение:К сожалению, в JSDoc нет способа переопределить документацию анонимной функции, как вы пытались это сделать. Тем не менее, вы можете заставить свои намерения использовать VSCode следующим образом, обратите внимание, что это вводит дополнительный вызов функции:
источник