You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:29:52