typescript - Kan en typad funktion rekursivt komma åt objektets egenskaper?


Finns det ett bra sätt i TypeScript att typa en funktion som rekursivt kommer åt objektets egenskaper? Här är ett handkodad exempel på att gå två nivåer djupt:

function deepProp<T, K extends keyof T>(obj: T, prop1: K, prop2: keyof T[K]) {
    return obj[prop1][prop2];
}

// Example use
const obj = {
    user: {
        pets: [{
            toys: [{
                name: "Toughy",
                price: 1999
            }]
        }]
    }
} as const
deepProp(obj, "user", "pets");

Men jag letar efter ett bra sätt att ta emot valfritt antal props i deepProp-funktionen för att gå ner så djupt som behövs. Jag tänker mig att funktionens signatur skulle vara något i stil med function deepProp(obj, ...props) { }. Finns det ett bra sätt att göra detta? Tack!

Svar #1

Det är inte möjligt för godtyckligt antal nycklar, men du kan göra något liknande Lodashs get för dina behov.

Det är också möjligt att använda funktionen på ett slags rekursivt sätt.

Exemplet med nämnda _.get (dess typ stöder upp till 4 nycklar):

const obj = {
    user: {
        pets: [{
            toys: [{
                name: "Toughy",
                price: 1999
            }]
        }]
    }
} as const

const toy1 = _.get(obj, ["user", "pets", 0, "toys"]); // correct type
const toy2 = _.get(obj, ["user", "pets", 0, "toys", 0]); // any :(
const toy3 = _.get(_.get(obj, ["user", "pets", 0, "toys"]), [0]); // correct type :)