Всем привет.
Хотелось бы из подоюных классов
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 может быть любым объектом.