【问题标题】:Remove undefined resolved promise from array of promise in typescript从打字稿中的承诺数组中删除未定义的已解决承诺
【发布时间】:2021-09-01 11:58:30
【问题描述】:

我正在使用打字稿,并且我有一个异步函数,当它被解决时,它将返回我的值string or undefined。函数原型如下所示:

const someFunction = async(someParam : string) => Promise<string | undefined>

现在我将在另一个函数(say myFunction) 中调用这个函数以获得一些不同的值并获得承诺。

const myFunction = async(params : string[]) : Promise<string[]> => {
    const results = params.map(async (param) => {
        const value = await someFunction(param);
        return value;
    });
    return Promise.all(results);
};

这里出现以下错误:

Type '(string| undefined)[]' is not assignable to type 'string[]'.
  Type 'string | undefined' is not assignable to type 'string'.
    Type 'undefined' is not assignable to type 'string'.)

我想删除那些未定义的值(这件事可以使用过滤器来完成)但我也不想更改我的返回类型myFunction。我想保留它的返回类型Promise&lt;string[]&gt; 而不是@987654328 @。有人可以帮我怎么做吗?

更新:我已经删除了这样的未定义值:

const myFunction = async(params : string[]) : Promise<string[]> => {
    const results = params.map(async (param) => {
        const value = await someFunction(param);
        return value;
    }).filter(value => value!== undefined);
    return Promise.all(results);
};

现在我已经删除了未定义的值。但是我仍然遇到与以前相同的错误。 Typescript 仍然要求我将函数的返回类型从 Promise&lt;string[]&gt; 更改为 Promise&lt;(string | undefined)[]&gt;

【问题讨论】:

  • 所以如果params 数组和myFunction 的(包装的)返回数组有不同的长度就可以了吗?因为如果您想过滤掉 undefined 值,就会出现这种情况。既然您已经知道可以使用过滤器从数组中删除 undefined 值,那么您卡在哪里了?
  • @FelixKling 是的,如果长度不同就可以了。
  • 我可能是错的,但删除undefined 结果在运行时不会解决您的Typescript 错误。为此,您可能至少需要.reduce() 而不是.map()
  • @FelixKling 主要问题是打字稿抛出错误是我需要将返回类型从 {Promise} 更改为 {Promise} 我不想。
  • 当您返回 Promise&lt;(string | undefined)[]&gt; 时,Promise&lt;String[]&gt; 是错误的返回类型。要么更改返回类型,要么过滤掉undefined

标签: javascript typescript es6-promise


【解决方案1】:

如你所说,.filter 可用于删除undefined 值:

const myFunction = async(params : string[]) : Promise<string[]> => {
    const results = await Promise.all(params.map((param) => someFunction(param)));
    return results.filter((r): r is string => r !== undefined);
};

但是,我们需要帮助 Typescript 了解一下回调会过滤掉 undefined 值,这就是 r is stringtype predicate)的用途。

【讨论】:

  • 天哪,你太棒了。太感谢了。有效。看来我还有很多东西要学。
猜你喜欢
  • 2017-06-02
  • 2019-10-15
  • 2022-01-27
  • 2018-04-02
  • 2018-12-28
  • 2016-07-20
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
相关资源
最近更新 更多