我要检查对象内部的数组是否存在,不为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}
答案 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
}
看起来不错!希望能有所帮助;祝你好运。
答案 1 :(得分:0)
像这样使用可选链接
if (profile?.[section]?.length) { // do something }