使用 class 的方法在打字稿中创建联合类型

create a union type in typescript with methods of a class

我正在查看一些遗留代码,他们将所有 redux reducer 创建为 class:

的实例方法
@Injectable()
export class PeopleActions {
    constructor(private ngRedux: NgRedux<any>) {}

    add() {
      this.ngRedux.dispatch({ADD, payload: {foo: 'bar;});
    }

    remove() {
      this.ngRedux.dispatch({Remove, payload: {foo: 'bar;});
    }
    // etc.

我通常会将它们创建为单独的函数

export function add { // etc.}
export function remove { // etc.}

然后创建联合:

type MyActions = add | remove;

我能否以某种方式创建 class 实例方法的联合?

如果您想要所有键的联合,您可以使用 keyof

type MyActions = keyof PeopleActions; // "add" | "remove"

如果 class 也有 public 字段不是方法,而您想过滤掉它们,您可以使用条件类型:

type ExtractFunctionKeys<T> = { [P in keyof T]-?: T[P] extends Function ? P : never}[keyof T]
type MyActions = ExtractFunctionKeys<PeopleActions>; // "add" | "remove"