Создать тип объединения в машинописи с помощью методов класса

Я смотрю на некоторый унаследованный код, и они создали все редукторы как методы экземпляра класса:

@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;

Можно ли как-то создать объединение методов экземпляра класса?

1 ответ

Решение

Если вы хотите объединить все ключи в тип, который вы можете использовать keyof

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

Если у класса также есть открытые поля, которые не являются методами, и вы хотите отфильтровать их, вы можете использовать условный тип:

type ExtractFunctionKeys<T> = { [P in keyof T]-?: T[P] extends Function ? P : never}[keyof T]
type MyActions = ExtractFunctionKeys<PeopleActions>; // "add" | "remove"
Другие вопросы по тегам