NGRX 감속기에 일종의 초기 값을 제공하는 경우에만 정의됩니다. 그렇게하지 않으면 잠재적으로 정의되지 않을 수 있습니다.
당신이 배열을 처리하는 경우에, 당신은 []
에 초기 값을 설정하려면 : 당신이 어딘가에 무엇인가를 정의하지 않은 경우
const initialState = [];
export function myReducer(state = initialState, action: Action)
....
타이프 스크립트 컴파일러가 정확한지, 당신은 잠재적으로 정의되지 않은 값을 가질 수 .
편집
난 당신이 컴파일러가 정확하게 null 값을 감지하지된다는 점에서 옳다고 생각합니다. 내가 strictNullChecks
를 켜고 다음을 수행하는 경우, 그것을 잘 작동합니다 : 나는 filter
을 제거하는 경우 사실, 그것은 여전히 오류없이 컴파일
arr: Person[] = [];
ngOnInit() {
this.arr
.filter(x => !!x && !!x.firstName)
.map(x => console.log(x.firstName));
}
. 만약 내가 을 결코 정의하지 않았기 때문에 this.arr.push(<Person>{lastName: 'test'});
을 추가하면 오류없이 컴파일되므로 정의되지 않습니다. 내가 arr
의 서명을 제거하면
그때 x.firstName
이 정의되지 않았 : 컴파일러 오류를 얻을 수
arr = [];
ngOnInit() {
this.arr
.filter(x => !!x && !!x.firstName)
.map(x => console.log(x.firstName));
}
그래서 필드가 있는지 반드시 객체 인터페이스에 존재하지만 여부 strictNullChecks
검사와 타이프 스크립트 컴파일러 정의됩니다.
답장을 보내 주셔서 감사합니다. 하지만 분명히 'map (value => value.prop)'이라는 필터가 없기 때문에 에러가보고되는 곳은 결코 없을 것입니다. –
하나는 생각할 것입니다. 또한 ngrx 저장소에서 문자열 선택기를 사용하고 있다는 사실에 의해 영향을받을 수도 있습니다. 대신에'this.store.select (s => s.state)'를 사용하여 인터페이스 하드 코딩을 시도하십시오. 이 방법을 사용하면 컴파일러는 ''으로 캐스트하는 대신 저장소의 데이터 형식을 올바르게 추론합니다. –
안타깝게도 운이 없다 ... :( –