Типизировать функцию get(obj, path), где path — строка вида 'a.b.c'. Тип результата должен выводиться автоматически, а невалидные пути — подсвечиваться ошибкой.
// Рекурсивный вывод типа значения по пути "a.b.c"type PathValue<T, P extends string> = // Разбиваем путь на голову и хвост через template literal + infer P extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? PathValue<T[Key], Rest> // рекурсивно спускаемся по хвосту : never : P extends keyof T ? T[P] // базовый случай: путь без точки : never;function get<T, P extends string>(obj: T, path: P): PathValue<T, P> { return path .split('.') .reduce((acc: any, key) => acc?.[key], obj);}
Как это работает
Template literal type `${infer Key}.${infer Rest}` разбивает строку пути: Key — первый сегмент, Rest — остаток.
Key extends keyof T проверяет, что сегмент есть в объекте; иначе тип never (и путь становится невалидным).
Рекурсия PathValue<T[Key], Rest> спускается вглубь, пока в пути не останется точек — тогда срабатывает базовый случай T[P].
Рантайм — обычный reduce с опциональной цепочкой; вся магия в типах.