【问题标题】:How to make an item in a fixed array of Promises optional using Typescript如何使用 Typescript 使固定的 Promises 数组中的项目成为可选
【发布时间】:2025-11-24 12:50:01
【问题描述】:

我有这样的事情:

const promises:
            | [Promise<boolean>, Promise<boolean>]
            | [Promise<boolean>, Promise<boolean>, Promise<{ currency: string; price: number }>] = [
            User.is1337(user._id),
            PurchasedItemsModel.exists({
                type: 'course',
                userid: user._id,
                slug: courseSlug
            })
        ]

我想正确输入promises 变量。

稍后在代码中,我按如下方式推送到 promises 数组:

promises.push(
                getSingleCoursePrice({
                    slug: courseSlug,
                    country,
                    percentOff: couponData?.percentOff || 0
                })
            )

当我这样推动时,打字稿给我一个错误:

【问题讨论】:

    标签: javascript node.js typescript es6-promise


    【解决方案1】:

    另一种解决方法可能是:

    const promises: | [Promise<boolean>, Promise<boolean>, Promise<{ currency: string; price: number }> | undefined] = [
        User.is1337(user._id),
        PurchasedItemsModel.exists({
            type: 'course',
            userid: user._id,
            slug: courseSlug
        }),
        undefined // Will filter this out later
    ]
    

    现在我可以随心所欲地推送:

    promises.push(Promise.resolve(true))
    promises.push(Promise.resolve({ currency: '$', price: 1}))
    promises.push(getSingleCoursePrice({
        slug: courseSlug,
        country,
        percentOff: couponData?.percentOff || 0
      })
    )
    

    您最后需要做的额外步骤:

    promises.filter(o =&gt; o);

    【讨论】:

    • 有趣的解决方法
    • 但现在我在想我最好还是使用任何一个?
    • 你可以,但任何会删除对值类型的所有限制,你将能够直接推送非承诺、字符串、数字。虽然当前的类型检查只允许 3 个值,布尔值、自定义对象和未定义。
    • 没错。谢谢,虽然男人
    【解决方案2】:

    我想您可以使用以下解决方法:

        promises = [
            ...promises,
            getSingleCoursePrice({
                slug: courseSlug,
                country,
                percentOff: couponData?.percentOff || 0
            })
        ];
    

    更新:

    TS Playground.

    【讨论】:

    • 是的,这行得通。谢谢你
    • 但这也带来了一个问题,当我在做 Promise.all(promises)
    • 任何错误抛出?
    • 是的,它说它无法解析 Promise.all(promises) 中的 [Promise, Promise]
    • 有趣,我无法在 TS Playground 中复制该错误。更新了答案。
    最近更新 更多