sourcecode

RxJS 관찰 가능한 필터에서 정의되지 않음

copyscript 2023. 6. 13. 22:30
반응형

RxJS 관찰 가능한 필터에서 정의되지 않음

필터링에 사용되는 특정 관용구 또는 유틸리티가 있습니까?undefinedRxJS 관측 자료에서?는 제가 있습니다.

obs.pipe(filter(x => x !== undefined))

몇 가지 대안은 다음과 같습니다.

obs.pipe(filter(x => x)) // for all falsy values

obs.pipe(filter(Boolean)) // for falsy variables using Boolean ctor

엄밀히 말하면 정의되지 않은 값을 제거하기 위해 필터만 사용해도 필요한 모든 작업이 수행되지 않습니다.정의되지 않은 값을 필터링하지만 정의되지 않은 값이 더 이상 가능하지 않음을 나타내도록 유형을 변경하지는 않습니다.

예제:

const obs = new Subject<string | undefined>;
const stringObs = obs.pipe(filter(x => x !== undefined))

그자리의 stringObs관찰 가능한 유형은 여전히 있습니다.Observable<string | undefined>.

이 문제를 해결하려면 다음을 사용해야 합니다.

const stringObs = obs.pipe(filter(x => x !== undefined) as OperatorFunction<string | undefined, string>)

이것은 엄격한 null 검사를 사용하는 경우에만 실제로 문제가 되지만, 사용자 지정 연산자를 만드는 것이 갑자기 훨씬 더 의미가 있습니다!비슷한 것

function filterNullish<T>(): UnaryFunction<Observable<T | null | undefined>, Observable<T>> {
  return pipe(
    filter(x => x != null) as OperatorFunction<T | null |  undefined, T>
  );
}

그 일을 합니다.

그런 다음 다음을 사용할 수 있습니다.

const stringObs = obs.pipe(filterNullish())

및의종의 .stringObs▁▁be 될 것입니다.Observable<string>가 Typescript의 할 수 .T정확하게

정의되지 않은 값이 제거되었음을 유형 스크립트가 이해할 수 있도록 한 가지 방법은 사용자 지정 연산자를 만드는 것입니다.다른 방법은 사용자 정의 유형 가드를 통해 가능합니다.

function isDefined<T>(arg: T | null | undefined): arg is T extends null | undefined ? never : T {
  return arg !== null && arg !== undefined;
}

const obs = from(['hello', null, undefined]);
const filtered: Observable<string> = obs.pipe(filter(isDefined));

Rxjs 연산자는 낮은 수준으로 간주되며 예측 가능하게 사용할 수 있는 관측치를 생성하기 위해 읽기 쉬운 방식으로 결합됩니다.당신을 위해 '유틸리티'가 그렇게 하는 것은 정확히 제가 (겸손하게) "rxjs 방식"이라고 부르는 것이 아닙니다.만약 'idiom'이 관습처럼 의미한다면, 코드 예제는 기본적으로 당신이 찾고 있는 것입니다.

저 자신도 사용자 정의 연산자를 만드는 것을 고려할 정도로 정확한 필터 패턴을 정기적으로 사용합니다. 하지만 이것보다는:

obs.pipe(filter(x => x !== undefined))

다음과 같은 결과를 초래할 것입니다.

obs.pipe(notUndefined()) // or hasValue() or whatever you want to name it...

여기에는 저축이 많지 않습니다.저는 당신이 가독성(또는 완전히 한계적인 것)에 대한 저축을 얻지 못하고 있다고 주장하고 싶습니다. 그래서 저는 그것을 해본 적이 없습니다. 또 다른 값을 입니다. 연산자가 두합니다. 이 연산자는 이대 동 해 기 필 부 값 이 것 일 는 하 는 반 적 이 기 때 이 다 문 입 니 링 울 하,▁another▁using▁created▁be다때이▁operators기이▁of like ,니문 ▁that에 입 ▁notification 그러면 혼동되거나 유사한 연산자가 너무 많은 것을 피하기 위해 두 연산자를 결합해야 하는지 의문이 들기 시작합니다. 이 모든 연산자는 다음을 사용하여 쉽게 생성될 수 있습니다.filter어쨌든, 등등...

간단히 말해서, 저는 이 정확한 문제에 대해 많은 생각을 했고, 당신이 제공한 코드 예제를 사용한다고 주장할 것입니다.정답입니다."rx-js-y"입니다.읽을 수 있습니다.

그냥 사용할 수 있다는 말이 맞는 것 같습니다.

obs.pipe(필터(x => x))

이것도 마찬가지입니다.

obs.pipe(필터(x => x!== null & & x!== 정의되지 않음)

최신 버전의 유형 스크립트는 부울식 서술어를 필요로 하기 때문에 다음과 같은 이전의 잘못된 필터를 지원하지 않습니다.

filter(x => x)

이 경우 다음을 사용할 수 있습니다.

filter(x => !!x)

언급URL : https://stackoverflow.com/questions/57999777/filter-undefined-from-rxjs-observable

반응형