异步/等待后,Flow仍将变量解释为Promises

7

复制:


// @flow
type A = { key: string, value: string};

const a:A = {
  key: 'a',
  value: 'a'
};

const foo = ():Promise<A> => {
    return new Promise(function(resolve, reject){
        setTimeout(function(){
            resolve(a);
        }, 1000);
    });
}

const bar = async ():A => {
    const res:A = ((await foo()):any);
    return res;
}

bar();

在 flow.org/try 上试一下

背景:

使用await调用返回Promise的函数'foo'时,变量的类型仍然为Promise。

如果我们只返回变量,Flow可以正确解释该值,但如果我们对名为'bar'的函数的返回进行类型标注,则会触发错误。

19:         return res;
                   ^ Cannot return `res` because property `key` is missing in `Promise` [1] but exists in `A` [2].
References:
[LIB] static/v0.75.0/flowlib/core.js:583: declare class Promise<+R> {
                                                        ^ [1]
17:     const bar = async ():A => {
                             ^ [2]

尝试的解决方案:
  • 强制将调用await的变量类型设置为'A'
  • 使用任何类型转换,然后将其设置为'A'似乎无法解决错误。
相关问题:

https://github.com/facebook/flow/issues/5294

此问题的目的:

我主要是在寻找解决方法。


在Stack Overflow上,必须将理解您问题所需的代码直接粘贴到问题中并适当地进行格式化。不允许仅将代码的引用作为外部链接存在。这是因为外部链接有时会更改或消失,从而使问题无法成为长期参考(这是Stack Overflow的使命之一)。 - jfriend00
1
一个 async 函数总是返回一个 Promise。要从该 Promise 中获取值,请使用 .then()await - jfriend00
1个回答

11

这似乎是一个简单的误解,但 Flow 的错误消息并不是很有用。

您已将bar声明为

const bar = async (): A => {

但是异步函数总是返回Promise,所以应该这样写:

但是异步函数总是返回承诺,所以它应该是这样的:

const bar = async (): Promise<A> => {

您可以在flow.org/try上看到它。


确实,我感到有点愚蠢,没有自己找到这个答案,但这确实是正确的答案。 - Alburkerk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接