Extract all function properties from given type

TypeScript

假设有一个 TypeScript 的类型是:

interface Example {
  str: string;
  num: number;
  func1: (param1: string, param2: number) => null;
  func2: () => void;
}

以下这个 TypeScript 的定义,可以用于将 T 中函数的部分抽离出来,形成新的类型:

type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};

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

最终,新类型的定义如下:

type Result = Pick<Example, FunctionPropertyNames<Example>>;

等价于:

interface Equivalent {
  func1: (param1: string, param2: number) => null;
  func2: () => void;
}