27 Feb 2023 06:11 PM - last edited on 20 Apr 2023 08:49 AM by educampver
I am trying to work on a fairly basic app that calls Dynatrace API for entities and then want to parse out the entityId and build an array of entities. I think that this might be specific to Typescript and not sure how to solve it. I know that I am getting an result array of objects, but when trying to use map, is telling me that entities is possibly undefined. Any help would be appreciated.
const [entitiesArray, setEntitiesArray] = useState<any[]>([]); useEffect(() => { monitoredEntitiesClient.getEntities( { entitySelector: 'type("HOST"),tag("OpenShift_App_Nodes")', from: 'now-1y/M', pageSize: 900 }) .then(response => { // console.log('response:', response) const entities = response?.entities console.log('entities:', entities) setEntitiesArray(entities.map(entity => entity?.entityId)) }) }, []);
Solved! Go to Solution.
27 Feb 2023 06:37 PM - edited 27 Feb 2023 06:39 PM
From @Michael_Beemer :
Basically, you're using optional chaining which returns either the value or undefined. In the solution I proposed ( const entities = response?.entities || []; ), it uses OR logic because if the entities property is missing, undefined is evaluations to a falsy value. That will set entities to an empty array. The ??
is called nullish coalescing ( entities?.map(…) ?? [] ) and is useful when the first value should be used if it's any other than undefined, even if it's a falsy value such as 0 or false.
Hope that's useful and makes sense.
27 Feb 2023 07:19 PM
I recommended the following changes:
Original code:
const entities = response?.entities;
Proposed change:
const entities = response?.entities || [];