#javascript #webstorm #jsdoc
#javascript #webstorm #jsdoc
Вопрос:
Я пишу вспомогательную функцию промежуточного программного обеспечения, которая возвращает массив, содержащий 3 элемента:
- Является ли либо
Server
илиIncomingMessage
- Является либо
ServerResponse
или нулевым - Всегда
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}}
*/