2017-04-06 1 views
2

value.length는 .map 연산자에 도달 할 때까지 항상 정의되어야합니다. 그러나 typesCript와 함께 strictNullChecks를 사용하면 "Object is undefined"라는 오류가 발생합니다. " 내가 잘못 했습니까? 아니면 알려진 문제입니까?Typescripts 엄격한 Null 검사 및 관찰 가능한 필터

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

답변

1

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 검사와 타이프 스크립트 컴파일러 정의됩니다.

+0

답장을 보내 주셔서 감사합니다. 하지만 분명히 'map (value => value.prop)'이라는 필터가 없기 때문에 에러가보고되는 곳은 결코 없을 것입니다. –

+0

하나는 생각할 것입니다. 또한 ngrx 저장소에서 문자열 선택기를 사용하고 있다는 사실에 의해 영향을받을 수도 있습니다. 대신에'this.store.select (s => s.state)'를 사용하여 인터페이스 하드 코딩을 시도하십시오. 이 방법을 사용하면 컴파일러는 ''으로 캐스트하는 대신 저장소의 데이터 형식을 올바르게 추론합니다. –

+0

안타깝게도 운이 없다 ... :( –