有没有办法在ngrx / store模型中强制执行接口定义(角度2)?

时间:2017-03-20 13:29:39

标签: angular ngrx

在不同的博客文章和官方ngnx /商店文档链接的示例中,我发现以下方法作为"标准"经营方式。我将发布与登录后将用户添加到商店相关的代码。

首先,我创建了一个Appstore接口,表示我们的应用程序处理的所有对象:

export interface AppStore {
 user: Observable<User>;
};

这是用户模型:

export interface User {
  id: number;
  username: string;
  email: string;
};

然后我为用户创建了一个reducer(其中有效负载包含用户ID,电子邮件和用户名)

export const user: ActionReducer<User> = (state: User, action: Action) => {
  switch (action.type) {
    case ADD_USER:
      return action.payload;
    default:
      return state;
  }
};

最后,我选择&#39;用户&#39;以这种方式来自商店的物品:

  user : User;

  constructor(private store: Store<AppStore>) {

        this.user = <Observable<User>>this.store.select('user');
  } 

但是,如果我将reducer更改为以下代码,即使在我看来User界面应该避免这种情况发生,无意义属性也会进入最终对象。

export const user: ActionReducer<User> = (state: User, action: Action) => {
  switch (action.type) {
    case ADD_USER:
      return Object.assign({},action.payload, meaninglessProperty = 'abcd');
    default:
      return state;
  }
};

所以,我的问题是:AppStore界面是一种可视化/理解我们应用程序整体商店结构的方式,还是ngrx商店实际检查Appstore中的属性是否尊重他们自己的界面合约?

  • 如果确实如此,我错过了什么?
  • 如果它没有,我可以改变一些东西,以确保在运行时强制执行接口定义吗?

我问这个是因为我有更复杂的场景,其中检查接口会使代码更安全&#34;它会减少犯错误的风险。

1 个答案:

答案 0 :(得分:1)

你的问题与ngrx并不真正相关,但是关于Object.assign的关于Typecript类型系统的问题更多,遗憾的是不能覆盖你的情况 - 你也可以在github上查看这个帖子以获得额外的有关此问题的详细信息:https://github.com/Microsoft/TypeScript/issues/10532