Reduce в TypeScript. Как правильно вывести значение объекта используя путь до этого значения?

Добрый день. Подскажите как правильно реализовать функцию на TypeScript:

extractValue(row: object, path: string) {
  return result = path.split('.')
      .reduce((accumulator: object, currentValue: string) => accumulator[currentValue], row);
}


Как правильно указать тип возвращаемого значения функции (string | number | undefined)?
  • Вопрос задан
  • 3238 просмотров
Решения вопроса 1
@z3d01n Автор вопроса
Добавлю свой вариант решения. Спасибо Алексей Ярков за наводку. Привлеку внимание к тому, что не используется тип any.

interface IObjectItem {
    [index: string]: IObjectItem | number | string;
}

extractValue(obj: IObjectItem, path: string): string | number {
    const value = path.split('.').reduce((accumulator: IObjectItem | string | number, currentValue: string) => {
        if (typeof accumulator === 'object' && accumulator[currentValue])
            return accumulator[currentValue];
        else
            throw new Error(`Unexpected parameter "${currentValue}"`);
    }, obj);

    // Проверка типа получившегося значения
    if (typeof value === 'string' || typeof value === 'number')
        return value;
    else
        throw new Error('The final value must be string or number');
}


Сама функция состоит из 2 частей: первая - получает значение исходя из заданного пути, вторая - делает проверку типа выходного значения.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@forspamonly2
нормального встроенного способа нет. народ это давно выпрашивает, но без толку: https://github.com/Microsoft/TypeScript/issues/12290
там в комментариях есть лютые извращения, к которым люди прибегают чтобы что-то похожее сделать.

а по-простому, для получения одного поля можно тупо передать нужный тип генерик параметром и закастить полученное перед возвратом. или передать параметром дефолтное значение на случай когда каких-то полей по пути нет, и вывести тип возврата из него.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы