RxJS distinctUntilChanged传undefined作为首个参数时失效的原因
问题:RxJS distinctUntilChanged传入undefined作为第一个参数时无法运行?
以下TypeScript代码无法正常运行:
let observable: Observable<{ key: number }> = of({ key: 123 }); observable.pipe( distinctUntilChanged(undefined, v => v.key) );
尽管RxJS存在如下重载定义:
export function distinctUntilChanged<T, K>( comparator?: (previous: K, current: K) => boolean, keySelector: (value: T) => K = identity as (value: T) => K ): MonoTypeOperatorFunction<T>
原因分析
问题出在TypeScript的重载解析逻辑上:
- RxJS的
distinctUntilChanged还有另一个更基础的重载签名:distinctUntilChanged(comparator?: (prev: T, curr: T) => boolean): MonoTypeOperatorFunction<T> - 当你给第一个参数传
undefined时,TypeScript会优先匹配这个基础重载——因为undefined符合基础重载里可选comparator的类型(参数可选允许传入undefined)。 - 此时你传入的第二个参数
v => v.key会被错误识别为基础重载里的comparator函数,类型完全不匹配,导致代码报错。
解决办法
有两种简单的修复方式:
- 直接省略第一个参数,利用keySelector的默认值,TS会自动匹配到带泛型K的重载:
observable.pipe( distinctUntilChanged(v => v.key) ); - 显式指定泛型参数,强制TS匹配目标重载:
observable.pipe( distinctUntilChanged<{key: number}, number>(undefined, v => v.key) );
内容的提问来源于stack exchange,提问作者tris
相关产品推荐
相关产品推荐

