arr.filter(x => Object.keys(x).length).length
As explained in other answers, Object.keys() returns property names from a given object. The inner .length is a shortcut to filter only items that have at least one property. The outer .length tells how many objects fit the description.
UPDATE:
The [].filter() method takes a function that returns a thruthy/falsy value. A number greater than 0 is thruthy, so it's the same as .length !== 0.
The assumption here is that any element contained in the array is non-null. Under this assumption it makes no sense checking the object for null inside the [].filter(). When using TypeScript, it's a static check for arr. If the assumption is broken, then an error is thrown, which it's something I usually desire. I don't hide runtime errors. If there's a runtime error here, I'll review the assumption. Yet I'm not sure it's the case here.
Object.keys(obj).lengthwill yield a non-zero result when there's at least one iterable, non-inherited property.detect when something is addedthis has more than one way to interpret it, with quite different solutions