解构与流动

时间:2017-10-06 20:24:40

标签: javascript flowtype flow-typed

我在Javascript中做了一些基本的解构:

//@flow
"use strict";

(function(){
    const {a,c} = check(true);
})();


function check(bool:boolean):{|a:string,c:string|}|{||}{
  if(bool){
    return { 
      a:"b",
      c:"d"
    };

  }
  else{
    return Object.freeze({});
  }
}

但Flow给了我错误。

5:  const {a,c} = check(true);
           ^ property `a`. Property not found in
9: function check(bool:boolean):{|a:string,c:string|}|{||}{
                                                  ^ object type
5:  const {a,c} = check(true);
             ^ property `c`. Property not found in
9: function check(bool:boolean):{|a:string,c:string|}|{||}{
                                                      ^ object type

web compiler link

Flow寻找什么,我该如何解决?

2 个答案:

答案 0 :(得分:2)

check()的签名不是{a:string,c:string} 我编辑了你的代码以尊重这种类型并且它有效。

//@flow
"use strict";

(function(){
    const {a,c} = check(true);
})();


function check(bool:boolean):{|a:string,c:string|}{
   if(bool){
      return { 
         a:"b",
         c:"d"
      };

   } else{
     return Object.freeze({a: "", c: ""});
   }
}

您没有告诉您的具体用例,如果此解决方案不适合您,请随时发表评论。

答案 1 :(得分:0)

问题是,截至目前,您的函数返回类型可以是空对象,也可以是{a: string, b: string}形式

function check(bool:boolean):{|a:string,c:string|}|{||}{

实际上是“ |”代表OR,因此在您的情况下,您的函数返回类型为{|a: string, C: string|}{|}

请参阅:https://flow.org/en/docs/types/unions/

然后在此函数中对其进行分解

const {a,c} = check(true);

它正在尝试访问空对象中的属性ac,因此流程显示此警告,因为check函数也可以返回空对象。

解决方案:

为变量a和c提供一些初始默认值,以便如果它们仍然不存在,则可以对其进行初始化

(function(){
    const {a='',c=''} = check(true);
})();