Я унаследовал некоторый угловой код, используя структуру 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)
?