从打字稿中的承诺数组中删除未定义的已解决承诺

Remove undefined resolved promise from array of promise in typescript

我正在使用打字稿,我有一个场景,我有一个异步函数,它将 return 我值 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'.)

我想删除那些未定义的值(这件事可以使用过滤器完成)但我也不想更改我的 return 类型的 myFunction。我想保留它的 return 输入 Promise<string[]> 而不是 Promise<(string | undefined)[]>。有人可以帮助我吗?

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

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 仍然要求我将函数的 return 类型从 Promise<string[]> 更改为 Promise<(string | undefined)[]>

如您所说,.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 string (a type predicate) 的作用。