A simpler approach with fp could be:
const removeEmptyProperties = fp.omitBy(fp.isEmpty);
const compactObject = (obj: unknown) => {
return fp.mapValues((value: unknown) => {
if (fp.isObject(value)) {
return removeEmptyProperties(compactObject(value));
}
return value;
})(obj);
};