我希望value.length总是由到达.map运算符的时间来定义。但是使用strictNullChecks和typescript会引发错误"对象可能是未定义的'。"我错了,或者这是一个已知问题?
this.count$ = this.store.select<Model>('state')
.filter(value => !!value && !!value.prop)
.map(value => value.prop)
答案 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编译器会检查对象接口上是否存在字段,但不一定是否已定义字段。