首页 > 解决方案 > 用于在 TypeScript 中过滤对象/类的方法的条件类型

问题描述

如何过滤对象的属性以仅获取那些是方法的属性?

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'

标签: typescripttypesconditional-types

解决方案


来自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'

推荐阅读