Как описать функцию, возвращающую массив, состоящий из 3 элементов разных типов

#javascript #webstorm #jsdoc

#javascript #webstorm #jsdoc

Вопрос:

Я пишу вспомогательную функцию промежуточного программного обеспечения, которая возвращает массив, содержащий 3 элемента:

  1. Является ли либо Server или IncomingMessage
  2. Является либо ServerResponse или нулевым
  3. Всегда Function

Вспомогательная функция выглядит примерно так:

 function getCallbackParts(args) {
    return [
        args[0],
        args.length === 3 ? args[1] : null,
        args.length === 3 ? args[2] : args[1]
    ];
}
  

Итак, позже в коде я делаю что-то вроде этого:

 function MyMiddleware() {
    const [request, response, next] = getCallbackParts(arguments);

    request.transportType = request.hasOwnProperty('rooms') ? 'socket.io' : 'http';

    next();
}
  

У меня нет проблем с выполнением кода, но мне нужно задокументировать getCallbackParts возвращаемый результат, поэтому моя IDE (я использую WebStorm) автоматически обработает request его как либо Server или IncomingMessage .

Я попробовал это (вариант 1, объединенные варианты, которые дают тот же результат):

 /**
 * @return [Server|IncomingMessage, ServerResponse|null, Function]
 * @return [(Server|IncomingMessage), (ServerResponse|null), Function]
 * @return {[Server|IncomingMessage, ServerResponse|null, Function]}
 * @return {[(Server|IncomingMessage), (ServerResponse|null), Function]}
 */
  

Но таким образом моя среда разработки показывает, что request может быть Server , IncomingMessage , ServerResponse , null , или Function . То же самое для response и для next .

Я также пробовал это (вариант 2, объединил два варианта, которые дают одинаковый результат):

 /**
 * @return {Array<(Server|IncomingMessage), (ServerResponse|null), Function>}
 * @return {Array.<(Server|IncomingMessage), (ServerResponse|null), Function>}
 */
  

Таким образом, request правильно определяется, но response по next какой-то причине также наследуется Server|IncomingMessage тип.

Как написать правильный возвращаемый тип JSDoc в этом случае?

Ответ №1:

Попробуйте группировать с помощью круглых скобок.

 /**
 * @return {[(Server|IncomingMessage), (ServerResponse|null), Function]}
 */
  

Комментарии:

1. Я также попробовал это (и обновил «вариант 1» в своем вопросе, чтобы показать, что я пытался). Таким образом, IDE показывает, что запрос может быть Server , IncomingMessage , ServerResponse , null , или Function .

Ответ №2:

Решил это так:

 /**
 * @return {{0: Server|IncomingMessage, 1: ServerResponse|null, 2: Function}}
 */