Javascript 如何进行内联属性检查以返回布尔值?

Javascript 如何进行内联属性检查以返回布尔值?,javascript,typescript,webstorm,Javascript,Typescript,Webstorm,我有一个功能: function test(obj?: { someProperty: string}) { return obj && obj.someProperty; } 我的假设是,这个函数的返回值是一个布尔值(正如WebStorm告诉我的)。但是TypeScript编译器抱怨返回值为etherundefined | string 我的问题 如何在TypeScript中编写正确的内联属性检查,它在任何情况下都会返回布尔值 我可以写: function test(ob

我有一个功能:

function test(obj?: { someProperty: string}) {
  return obj && obj.someProperty;
}
我的假设是,这个函数的返回值是一个布尔值(正如WebStorm告诉我的)。但是TypeScript编译器抱怨返回值为ether
undefined | string

我的问题

如何在TypeScript中编写正确的内联属性检查,它在任何情况下都会返回布尔值

我可以写:

function test(obj?: { someProperty: string}) {
  return !!(obj && obj.someProperty);
}

但这对一些人来说似乎有点不舒服

您可以将返回值包装为:


jsiddle:

运算符不隐式转换为布尔值。实际发生的情况:

A && B && C
// if A is falsy return A
// else return B && C
//      if B is falsy return B
//      else return C
在您的情况下,您有三种可能性:

  • obj未定义->返回未定义
  • obj已定义,但
    someProperty
    未定义->返回未定义
  • obj已定义且
    someProperty
    已定义->返回某些属性(在本例中为字符串)

  • 您可以使用此解决方案:

    function test(obj?: { someProperty: string}) {
      return obj && obj.someProperty && true || false;
    }
    

    我认为正确的起点是添加
    boolean
    作为返回类型(
    函数测试(…):boolean{
    )。那么此强制转换或
    !!
    @SamiHult将布尔值添加为返回类型都不起作用,因为
    未定义值不可分配给布尔值
    @SamiHult我不确定添加返回类型是否足以解决问题。不,添加返回类型不会解决问题,这就是我将其作为注释编写的原因。不,我没有这样做注意,我认为这是一种解决问题的方法。
    return Boolean(obj&&obj.someProperty);
    return!!(obj&&obj.someProperty);
    相同,因此这实际上没有帮助,因为问题中已经说明了这一点。这并不能真正回答问题。谢谢你的提示!我不知道这一点(即使我的函数的返回类型正好说明了这一点;)@SamiHult是真的,但这是一个有用的信息,有助于理解核心问题。@SamiHult不,这不是答案。但这是他解决问题所需要的信息。给一个人一条鱼……我会给出相同的答案,只是补充说,最简单的解决方法是他已经找到的方法,使用
    !!
    。Typescript models是JS的确切行为,因此可以说
    obj&&obj.someProperty
    undefined | string
    如果您只想检查属性是否存在,那么
    !!(obj&&obj.someProperty)
    是一个有效的解决方案,我个人更喜欢
    !!obj&&!!obj.someProperty
    。有趣。但是像
    !!
    一样,JavaScript高级用户很难阅读。这也可能返回未定义的
    obj失败。所以你可以使用这个:obj!=null&&obj.hasOwnProperty(“someProperty”),情况越来越糟:P
    
    function test(obj?: { someProperty: string}) {
      return obj && obj.someProperty && true || false;
    }