Typescripts严格空检查和可观察过滤器

时间:2017-04-06 13:50:13

标签: javascript angular typescript observable

我希望value.length总是由到达.map运算符的时间来定义。但是使用strictNullChecks和typescript会引发错误"对象可能是未定义的'。"我错了,或者这是一个已知问题?

this.count$ = this.store.select<Model>('state')
            .filter(value => !!value && !!value.prop)
            .map(value => value.prop)

1 个答案:

答案 0 :(得分:2)

只有在NGRX减速器中提供某种初始值时才会定义它。如果你没有这样做,它可能是不确定的。

如果您正在处理数组,那么您希望将初始值设置为[]

const initialState = [];

export function myReducer(state = initialState, action: Action)
....

TypeScript编译器是正确的,如果您还没有在某处定义某些内容,则可能会有一个未定义的值。

修改

我认为你是对的,因为编译器没有准确地检测空值。如果我打开strictNullChecks并执行以下操作,则可以正常使用:

arr: Person[] = [];

ngOnInit() {
  this.arr
    .filter(x => !!x && !!x.firstName)
    .map(x => console.log(x.firstName));
}

实际上,如果删除filter,它仍会编译而不会出错。如果我添加this.arr.push(<Person>{lastName: 'test'});它仍然编译没有错误,即使我从未在对象上定义firstName因此它将是未定义的。

如果我删除了arr上的签名,那么我会收到x.firstName未定义的编译错误。:

  arr = [];

  ngOnInit() {
    this.arr
      .filter(x => !!x && !!x.firstName)
      .map(x => console.log(x.firstName));
  }

因此带有strictNullChecks的TypeScript编译器会检查对象接口上是否存在字段,但不一定是否已定义字段。