我想检查对象中的数组是否存在,不为空且不为空
我需要在括号表示法中引用该属性。
我的对象
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}
像这样使用可选的链接
if (profile?.[section]?.length) { // do something }
见 https://stackoverflow.com/a/58780897
这是一个已知的错误,其修复存在,但由于可能的性能问题,可能无法将其纳入语言。
我们在等待时能做什么? 好吧,一种可能的解决方法是引入一个用户定义的类型保护函数,该函数在内部执行相同的检查,但强制编译器按照您希望的方式缩小对象的类型:
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
键属性是必需的,因此不可为空/未定义。 让我们看看它的实际效果:
if (
section in profile &&
hasDefinedProp(profile, section) &&
profile[section].length // okay now
) {
// do something
}
看起来不错! 希望有帮助;祝你好运。
链接到代码