【问题标题】:How to check nullity in typescript using Bracket notation如何使用括号表示法检查打字稿中的无效性
【发布时间】:2023-03-07 22:09:02
【问题描述】:

我想检查一个对象内的数组是否存在,不为空也不为空

我需要在括号中引用该属性。

我的对象

profile = {
    myArray: [1,2,3]
}

我正在像这样检查它

const section = "myArray";
if(section in profile && profile[section] && profile[section].length ) { // do something}

我希望这能正常工作,但我在这部分 profile[section].length 中收到一个错误,上面写着 object is possibly null or undefined

如果我使用点表示法,它可以正常工作

if('myArray' in profile && profile.myArray && profile.myArray.length ) { // do something}

【问题讨论】:

  • 错字? myArray = [1,2,3] = 应该是冒号。
  • @evayly 是的,这是一个错字,谢谢
  • 在 TypeScript 中,无论何时使用 object[...] 表示法,它都依赖于 object 的索引签名。因此,它无法判断您已检查真实性的属性与您正在访问的 length 属性相同的属性。

标签: typescript object null


【解决方案1】:

像这样使用可选链

if (profile?.[section]?.length) { // do something }

https://stackoverflow.com/a/58780897

【讨论】:

    【解决方案2】:

    这是一个known bug,其fix 存在,但由于可能的性能问题,它可能无法进入语言。

    等待的时候我们能做什么?好吧,一种可能的解决方法是引入 user-defined type guard 函数,该函数在内部执行相同的检查,但会强制编译器按照您希望的方式缩小对象的类型:

    function hasDefinedProp<T, K extends keyof T>(
      obj: T,
      k: K
    ): obj is T & Required<Pick<T, K>> {
      return !!obj[k];
    }
    

    类型T &amp; Required&lt;Pick&lt;T, K&gt;&gt; 表示它与T 的类型相同,只是K-keyed 属性是必需的,因此不能为空/未定义。让我们看看它的实际效果:

    if (
      section in profile &&
      hasDefinedProp(profile, section) &&
      profile[section].length // okay now
    ) {
      // do something
    }
    

    看起来不错!希望有帮助;祝你好运。

    Link to code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 2016-04-16
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      相关资源
      最近更新 更多