Условный тип для фильтрации методов объекта / класса в TypeScript - PullRequest
0 голосов
/ 23 марта 2020

Как отфильтровать свойства объекта, чтобы получить только те, которые являются методами?

const obj = {
  a: 1,
  b: 'text',
  c: () => null,
  d: (arg0: number) => arg0 + 1
}

type AllKeys = keyof typeof obj  // 'a' | 'b' | 'c' | 'd'

// type OnlyMethodsKeys = (???)  // 'c' | 'd'

1 Ответ

1 голос
/ 23 марта 2020

С https://github.com/microsoft/TypeScript/pull/21316:

type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T];
type FunctionProperties<T> = Pick<T, FunctionPropertyNames<T>>;

type NonFunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? never : K }[keyof T];
type NonFunctionProperties<T> = Pick<T, NonFunctionPropertyNames<T>>;

Итак, мы можем сделать:

type OnlyMethodsKeys = FunctionPropertyNames<typeof obj>  // 'c' | 'd'

Работает и для классов:

class C {
  a = 1
  b = 'text'
  c() {
    return null
  }
  d(arg0: number) {
    return arg0 + 1
  }
}

type AllKeys = keyof C  // 'a' | 'b' | 'c' | 'd'

type OnlyMethodsKeys = FunctionPropertyNames<C>  // 'c' | 'd'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...