Может ли типизированная функция рекурсивно обращаться к свойствам объекта? - PullRequest
2 голосов
/ 12 апреля 2020

Есть ли хороший способ в машинописи набрать функцию, которая будет рекурсивно обращаться к свойствам объекта? Вот пример с ручным кодированием глубины двух уровней:

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");

Но я ищу хороший способ взять любое число props в функции deepProp, чтобы погрузиться так глубоко, как нужно. Я полагаю, что подпись функции будет что-то вроде function deepProp(obj, ...props) { }. Есть ли хороший способ сделать это? Спасибо!

1 Ответ

2 голосов
/ 13 апреля 2020

Это невозможно для произвольного количества ключей, но вы можете сделать что-то похожее на loda sh get для ваших нужд.

Также возможно использовать функция рекурсивным способом.

Пример с упомянутым _.get (его тип поддерживает до 4 клавиш):

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 :)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...