TS очень не любит работать с произвольными объектами, так что совсем без any получится огромное убожество имеющее одну цель - ублажить TS. Оно того не стоит.
С any же всё просто, но надо быть аккуратным.
function getPropertyOfObject<T extends Record<PropertyKey, any>>(obj: T) {
const defaultKey = 'defaultKey';
function getProp<K extends keyof T>(keyOne: K): typeof defaultKey extends keyof T[K] ? T[K][typeof defaultKey] : void;
function getProp<K extends keyof T, K2 extends keyof T[K]>(keyOne: K, keyTwo: K2): T[K][K2];
function getProp(keyOne: PropertyKey, keyTwo?: PropertyKey) {
return obj?.[keyOne]?.[keyTwo ?? defaultKey];
}
return getProp;
}