如何描述返回数组的函数由 3 个不同类型的元素组成

How to describe a function returning an array consists of 3 elements of different types

我正在编写一个中间件辅助函数,它 return 是一个包含 3 个元素的数组:

  1. ServerIncomingMessage
  2. ServerResponse 或 null
  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 return 结果,所以我的 IDE(我使用 WebStorm)会自动处理 request 喜欢 ServerIncomingMessage.

我试过了(变体 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]}
 */

但是这样我的 IDE 显示 request 可以是 ServerIncomingMessageServerResponsenullFunctionresponsenext.

相同

我也试过这个(变体 2,合并两个产生相同结果的变体):

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

这样,request 被正确检测到,但是 responsenext 出于某种原因也继承了 Server|IncomingMessage 类型。

如何在这种情况下编写正确的 jsDoc return 类型?

尝试用括号分组。

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

这样解决的:

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