@nskaskyou

Typescript. Как создать интерфейс с полями не являющимися функциями из класса с функциями и вложенными классами?

Всем привет.

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

Войдите, чтобы написать ответ

Похожие вопросы