我正在使用typescript,我有一个场景,我有一个异步函数,它将返回我值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<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仍然要求我将函数的返回类型从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
(一个类型谓词)的作用。