如何使用括弧符号检查打字稿中的无效性

时间:2019-07-04 18:52:29

标签: typescript object null

我要检查对象内部的数组是否存在,不为null且不为空

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

我的对象

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}

2 个答案:

答案 0 :(得分:0)

这是一个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 & Required<Pick<T, K>>表示它与T的类型相同,只是必须使用K键属性,因此不能为null / undefined。让我们看看它的作用:

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

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

Link to code

答案 1 :(得分:0)

像这样使用可选链接

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

请参阅https://stackoverflow.com/a/58780897