Почему действия ngRX имеют тип? - PullRequest
4 голосов
/ 04 октября 2019

Я унаследовал некоторый угловой код, используя структуру ngRX

Действия определены как:

import {Action} from "@ngrx/store";

export const MY_ACTION: string = 'MY_ACTION';

export class MyAction implements Action {
    readonly type = MY_ACTION;

    constructor(public payload?:any) {
    }
}

Отправлено как:

store.dispatch(new MyAction());

Уменьшено как:

export function storeReducer(state: any, action:Action): ApplicationState {
    console.log("*** " + action.type);

    switch(action.type) {
        case MY_ACTION:
            return handleMyAction(state, action);
        }
    }
}

function handleMyAction(state: ApplicationState, action: MyAction): ApplicationState {
    const newState: ApplicationState = _.cloneDeep(state);
    // change newState as required
    return newState;
}

и подписан на подобное:

  @Effect() doSomethingWithMyAction$: Observable<Action> = this.actions$
        .pipe(
            ofType(MY_ACTION))
        .switchMap(action =>
            // Do something
        );

Теперь я, вероятно, показываю свое незнание JS здесь (исходя из фона .net), но почему у действия есть тип (установлен наконстантная строка)? Не могли бы вы использовать что-то вроде typeOf, чтобы проверить, что это за действие?

например,

export class MyAction implements Action {
    constructor(public payload?:any) {
    }
}

switch(typeof(action)) {
    case MyAction: // or typeOf(MyAction)
        return handleMyAction(state, action);
    }
}


@Effect() doSomethingWithMyAction$: Observable<Action> = this.actions$
      .pipe(
          ofType(MyAction))
      .switchMap(action =>
          // Do something
      );

Тогда вы можете избавиться от типов const и иметь более простой код.

Тот факт, что не сделано таким образом, приводитя могу предположить, что не может быть таким образом, или есть очень веские причины не делать этого таким образом, поэтому я предполагаю, что это мой недостаток знаний о том, что js / typcript вступает в игру.

В машинописном тексте typeOf дает вам класс, или просто 'объект' или подобное?

Существует ли js / ts эквивалентное число c # 'if(action is MyAction)?

1 Ответ

0 голосов
/ 04 октября 2019

На самом деле то, что вы имеете с интерфейсами, не является настоящим полиморфизмом в машинописи. Вот почему проверка типов должна быть реализована отдельно.

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

if ('doMyAction' in object.prototype) { }

Этот ответ на самом деле гораздо больше охватывает javascript, вы можете на него взглянуть.

РЕДАКТИРОВАТЬ:

Похоже, яполучил ваш вопрос наоборот :) В таком случае оператор instanceof должен работать. Если это чей-то исходный код, он мог бы быть написан в старом стиле javascript.

if(action instanceof MyAction)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...