Enumerating all object paths in TypeScript

Here’s a small recursive TypeScript function to enumerate all the paths through an object.

E.g. given this object:

{
    "animals": {
        "lion": { 
            "sound": "roar"
        },
        "zebra": { 
            "appearance": "stripes"
        },
        "elephant": {
            "size": "large",
            "features": {
                "trunk": "yes",
                "tusks": "yes",
                "wings": "no"
            },
        },
    },
},

It enumerates these paths:

[
    "animals",
    "animals/lion",
    "animals/zebra",
    "animals/elephant",
    "animals/lion/sound",
    "animals/zebra/appearance",
    "animals/elephant/size",
    "animals/elephant/features",
    "animals/elephant/features/trunk",
    "animals/elephant/features/tusks",
    "animals/elephant/features/wings",
]

The function:

function enumeratePaths(value: any): string[] {
    let paths: string[] = []
    if (value && typeof value === "object") {
        paths = Object.getOwnPropertyNames(value)
        for (const key of Object.getOwnPropertyNames(value)) {
            paths = [
                ...paths,
                ...enumeratePaths(value[key]).map(
                    (subKey) => `${key}/${subKey}`,
                ),
            ]
        }
    }
    return paths
}

Tech mentioned