Всем привет.
Хотелось бы из подоюных классов
class Smth {
  get name() {
    return "Frank";
  }
  get age() {
    return 5;
  }
  get things() {
    return { count: 5, getThing: () => "paper" };
  }
  getAddress() {
    return "Box";
  }
}
научиться получать такие вот интерфейсы
{
  age: number, 
  name: string, 
  things: {count: number}
}
Код для который работает для классов без вложенных объектов / классов
type NonFunctionPropertyNames<T> = {
  [K in keyof T]: T[K] extends Function ? never : K;
}[keyof T];
type NonFunctionProperties<T> = Pick<T, NonFunctionPropertyNames<T>>;
Получить все поля рекурсивно получилось
type NonFunctionPropertyNames<T extends Record<string, any>> = {
  [K in keyof T]: T[K] extends Function
    ? never
    : T[K] extends Record<string, any>
    ? NonFunctionPropertyNames<T[K]>
    : K;
}[keyof T];
Но Pick очевидно ругается и как быть дальше я не понимаю.
Выручайте!
ПС: T может быть любым объектом.