Добавлю свой вариант решения. Спасибо
Алексей Ярков за наводку. Привлеку внимание к тому, что
не используется тип 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 частей: первая - получает значение исходя из заданного пути, вторая - делает проверку типа выходного значения.