Assuming that the joined layer has a polygon_id field.
If you want to count how many points of each type are joined to each polygon, you can use the following expression:
array_to_string(
array_distinct(
array_agg(
count(
"id",
"type"||"polygon_id") || ' ' || "type",
"polygon_id"))
, ' , ')
There we are counting how many points are by type and polygon, aggregating them by polygon in an array and transforming the array to a string.
If you want to have a list of types inside a polygon and the total number of points inside a polygon, you can use the following expression:
concat(
'Types: ',
array_to_string(
array_distinct(
array_agg(
"type",
"polygon_id")),
' , '),
' . Points: ',
count(
"id",
"polygon_id"))
There we are doing something similar but just for the types, and then counting all the points.
Note:
If you are joining the polygons to the points or the points to the polygons, is no difference here. The joined layer must be similar (but in one case you have points, in the other polygons). Anyway, you will have a polygon id, a point id and a point type. Just use the field names of your joined layer in the expression.