资讯动态

RxJS 6.x 到 7.x 升级全指南:官方变更清单逐项解读与迁移实战

发布时间:2026/9/19 23:33:59 来源:尧图企业网站定制
RxJS 6.x 到 7.x 升级全指南官方变更清单逐项解读与迁移实战【免费下载链接】rxjsA reactive programming library for JavaScript项目地址: https://gitcode.com/gh_mirrors/rx/rxjs本指南以官方文档 6-to-7-change-summary.md 为骨架逐条解读 RxJS 从 6.x 升级到 7.x 的全部破坏性变更Breaking Changes与新特性New Features并结合本仓库中 RxJS 源码与测试给出底层依据。读完本文你将能判断自己的 6.x 代码哪些会在 7.x 下编译失败或行为改变掌握firstValueFrom/lastValueFrom、connectable/connect、share、timeout、throwError等新 API 的正确用法并据此制定一份可执行的迁移清单。RxJS 7 是一次以类型严谨化 内部实现收紧 行为语义修正为主的大版本升级。官方以模块rxjs、rxjs/operators、rxjs/ajax、rxjs/fetch、rxjs/testing为单位按 TypeScript API diff 的顺序整理了这份变更清单。仓库中packages/rxjs/src/下的实现如 connectable.ts、share.ts、timeout.ts、animation-frames.ts与 packages/rxjs/test/ported 下的移植测试是验证这些变更语义的第一手证据同时 packages/rxjs/MIGRATION.md 提供了从 RxJS 7 继续向本仓库当前开发版本symbol 化 RxJS 9 架构迁移的路径可作为长期演进参考。阅读本清单的方法这份清单的排序方式是按模块文件中 TypeScript API 逐个 diff 得到的因此它适合作为对照表使用先把你的 6.x 代码中import的来源按rxjs、rxjs/operators、rxjs/ajax、rxjs/testing分组再按下文小节逐一核对每个 API 是否命中破坏性变更命中项按文中的迁移指引改写最后用rxjs/testing的 TestSchedulerexpectObservable().toEqual()对改写前后的操作符链做行为等价性校验。下文严格继承官方清单的全部条目并为每个关键点补充源码证据与可运行的迁移示例。rxjs模块破坏性变更Breaking Changes类与 Subject 族的可见性收紧这一组变更的共同主题是把实现细节从公共 API 中移除类内部状态只读化。类变更内容影响AsyncSubject_subscribe由public变为protected不再拥有从Subject继承的error方法的独立实现不能从外部直接调用_subscribe子类行为不再被 AsyncSubject 特化BehaviorSubjectvalue由readonly value改为 getterget value()不能再被外部强制赋值直接subject.value x赋值写法在 7.x 会编译失败ConnectableObservable移除_isComplete属性_subscribe由public变为protected外部无法再读写_isCompleteGroupedObservable不再公开暴露_subscribe与constructorkey属性改为readonly无法再new GroupedObservable(...)key不可写ReplaySubject移除_getNow方法_subscribe由public变为protected依赖_getNow自定义时间源的代码需改为传入timestampProvider之类配置Subscriberdestination必须是Subscriber或完整的Observer移除syncErrorThrowable、syncErrorThrown、syncErrorValue三个属性与_unsubscribeAndRecycle方法依赖同步错误状态机内部字段的代码全部失效Subscription移除_parentOrParents属性内部父子树结构不再暴露VirtualAction移除静态方法sortActions依赖手动排序调度器的代码需自行实现Observable移除_isScalar属性_subscribe、_trySubscribe不再public标记internal曾用于判断是否是标量或直接调用内部订阅路径的代码必须改写Observable类上的其他破坏性变更pipe传 9 个及以上参数时返回类型从Observable{}变为Observableunknown。对{}到unknown的收窄意味着依赖{}可赋值给任意对象类型的代码会编译失败需要显式断言。toPromise返回类型修正为PromiseT | undefined。这是一个无运行时变化的修正因为 Observable 在完成前若未发出任何值Promise 本来就 resolve 为undefined。7.x 只是把类型写正确了。详见 to-promise 弃用指南。static if与static throw属性被移除这两个静态属性在 6.x 已无人使用直接删除。lift、source、operator仍然deprecated它们是实现细节8.x 中极可能被改名或移除迁移时应避免依赖。Subscription.add返回值变更add方法在 7.x 返回void不再返回Subscription这是 5.x 早期的遗留行为。// RxJS 6 及更早的写法7.x 编译失败 const sub subscription.add(subs1); sub.add(subs2); // RxJS 7 正确写法 subscription.add(subs1); subs1.add(subs2); // 或直接链式加入 subscription.add(subs1); subscription.add(subs2);移除回调的新方式subscription.add(fn)添加的函数可直接用同一个函数实例subscription.remove(fn)移除不再需要保存add的返回值再传给remove。仓库源码中Subscription已支持add/remove直接操作函数见下文新特性。泛型签名变更不要显式传泛型以下创建函数/组合函数在 7.x 中泛型签名已改变官方建议不要显式传泛型让 TypeScript 从参数推断bindCallback、combineLatest、concat、forkJoin、iif、merge、of、onErrorResumeNext、pairs、partition、race、zip以及rxjs/operators下的combineLatest、concat、concatAll、concatMapTo、endWith、expand、merge、mergeAll、pluck、race、reduce、scan、startWith、switchAll、switchMapTo、withLatestFrom、zip。// RxJS 6 中常见的显式泛型写法7.x 可能报错或类型不精确 ofnumber(1, 2, 3); mergestring(a$, b$); // RxJS 7 推荐写法完全交给推断 of(1, 2, 3); // Observablenumber merge(a$, b$); // 类型自动联合仓库源码可以印证这一收紧方向以 zip.ts 为例其签名使用Sources extends readonly ObservableValueany[]的元组推断而不是固定数量的泛型参数这正是签名改变、勿手写泛型的根源。defer与iif不再允许返回void/undefineddefer泛型参数不再extends void工厂函数必须返回合法的ObservableInputObservable、Promise等。若此前依赖工厂返回undefined请改写为return EMPTY或return of()。iif结果参数不允许再传undefined这多半是错误调用模式。若确需空流用EMPTY替代// 6.x 的坏写法 iif(() cond, source$, undefined); // 7.x 正确写法显式表达有意为空 iif(() cond, source$, EMPTY);这样既保证了行为是有意为之又避免了意外undefined参数导致的隐蔽 bug。fromEvent按目标类型拆分签名fromEvent现在对 DOM、Node、jQuery 等目标类型有各自独立的签名。向不支持 options 参数的目标类型传入{ once: true }等选项会直接产生 TypeScript 编译错误而不再是 6.x 中悄悄忽略。// DOM 目标支持 options fromEvent(document, click, { once: true }); // 若目标类型签名不支持 options则 TS 报错 —— 这其实是好事把错误提前到了编译期isObservable不再有泛型isObservable返回Observableunknown必须自行断言const value: unknown maybeObservable; if (isObservable(value)) { value.subscribe(observer); // value 此时是 Observableunknown // 需要具体类型时 const typed value as Observablenumber; }Notification构造只允许合法组合error、hasValue、kind、value全部变为readonlyvalue允许为undefined。constructor只允许合法构造例如new Notification(C, some_value)在 TypeScript 中直接报错C即 complete 类型不应携带值。race同步结束不再订阅后续源若某个源在订阅时同步 error 或 completerace将不再继续订阅其余源。这消除了此前在竞速场景中订阅副作用意外发生的罕见情况// 7.x 中若第一个源同步 complete后续源不会被订阅其订阅副作用也不会发生 race(syncCompleted$, other$);pairs依赖Object.entries且自身已弃用pairs在 IE 中不再可用需Object.entriespolyfill并且本身已被弃用官方建议直接使用from(Object.entries(obj))// 6.xpairs(obj) // 7.x from(Object.entries(obj)); // 产生 [key, value] 元组流zip单个数组的极端角例将单个数组 zip 的结果不同。极不常见的写法zip([1,2,3])不再有旧语义若确实需要可包一层zip([[1,2,3]])但官方也承认这相当奇怪正常代码不需要。Subscribable/SubscribableOrPromisesubscribe现在只接受PartialObserverT所有以函数为参数的 overload 已被移除。原因是Subscribable旨在对齐 TC39 Observable 提案的基础契约以及[Symbol.observable]()的返回类型// 6.x 允许subscribable.subscribe(value {...}) // 7.x 必须 subscribable.subscribe({ next: value {...} });rxjs模块新特性New FeaturesanimationFrames高分辨率动画帧流新的创建函数产生动画帧流每个事件携带高分辨率时间戳与自观察开始以来的流逝时间。源码见 animation-frames.ts每帧事件结构为{ timestamp, elapsed }其中timestamp优先使用requestAnimationFrame回调自带的帧时间戳elapsed用performance.now()计算并支持注入自定义timestampProvider便于测试import { animationFrames } from rxjs; animationFrames().subscribe(({ timestamp, elapsed }) { // 每帧触发一次timestamp 为该帧高分辨率时间elapsed 为相对起始的毫秒数 });config全局配置错误处理与兼容开关config提供三个全局配置项覆盖 RxJS 内部难以通过普通操作符触达的边界场景配置项作用config.onUnhandledError当观察者链末端没有错误处理器时处理一路传播到底的错误。典型用途为 RxJS 观察链做全局的未处理错误日志config.onStoppedNotification处理订阅者已停止收到 error 或 complete但尚未 finalize时又被通知的边界情况主要用于日志config.useDeprecatedNextContextRxJS 6 中一个极少使用的特性在next处理器里把subscriber作为this暴露。该行为带来严重性能损耗且几乎无人使用7.x 默认不再改变用户回调的this上下文。需要恢复该行为时打开此开关注意8.x 将彻底移除import { config } from rxjs; config.onUnhandledError (err) { console.error(Unhandled error in observable chain:, err); };connectable创建ConnectableObservable的新方式connectable是非 selector 形式的multicast/publish系列的替代品把源 Observable 与想连接的Subject一起传入即可。源码 connectable.ts 中的ConnectableConfig支持两个配置connector: () SubjectLikeT返回用于多播的 Subject默认new Subject()resetOnDisconnect?: boolean断开含源 complete/error后是否重建 Subject默认true即再次connect()时产生全新 Subject。connect()返回ConnectableConnection门面对象带closed只读属性与unsubscribe()方法内部基于AbortController实现源订阅的取消import { connectable, Subject } from rxjs; import { interval } from rxjs; const source interval(1000); const multicasted connectable(source, { connector: () new Subject(), resetOnDisconnect: true, }); const sub1 multicasted.subscribe({ next: v console.log(A, v) }); const sub2 multicasted.subscribe({ next: v console.log(B, v) }); const connection multicasted.connect(); // 真正开始订阅源 connection.unsubscribe(); // 断开连接仓库测试 connectable.spec.ts 验证了connectable返回的是Observable与ConnectableObservable的实例且结果上不存在next/error/complete方法防止被误当 Subject 使用connect()必须在Observable.prototype之外单独获取。firstValueFrom/lastValueFrom取代toPromise这是toPromise()已弃用的更好、更易 tree-shaking 的替代品firstValueFrom(source$)源发出第一个值时 Promise resolve并立即退订以释放资源lastValueFrom(source$)语义接近旧toPromise源 complete 时以最后一个值 resolve两者在源未发出任何值就完成时都会 reject 一个EmptyError其实现见 empty-error.ts错误消息为no elements in sequence若不想 reject可传入第二参数{ defaultValue }此时空流会 resolve 为该默认值。import { interval, take, lastValueFrom, firstValueFrom, EMPTY } from rxjs; async function last() { const finalNumber await lastValueFrom(interval(2000).pipe(take(10))); console.log(The final number is ${finalNumber}); // 9 } async function first() { const firstNumber await firstValueFrom(interval(2000)); console.log(The first number is ${firstNumber}); // 0 } async function withDefault() { const result await firstValueFrom(EMPTY, { defaultValue: 0 }); console.log(result); // 0 }注意官方明确警告只有确定 Observable 会 complete 时才用lastValueFrom确定会至少发出一个值或最终会完成时才用firstValueFrom。若源既不发出也不完成得到的 Promise 将永久挂起async 函数状态会滞留在内存中——应配合timeout、take、takeWhile、takeUntil等使用。完整细节见 to-promise 弃用指南。ObservableInput扩展接受AsyncIterable与ReadableStreamObservableInput是 RxJS 中几乎所有接受 Observable 的 API 的参数类型6.x 起就接受Observable、Promise、Iterable、ArrayLike7.x 新增AsyncIterable如 IxJS 定义的异步可迭代对象、async function*生成器产出的异步迭代器可传入任何接受 Observable 的 API并可直接from(asyncIterable)转换ReadableStream如fetch等返回的流同样可直接from(readableStream)转换。import { from } from rxjs; async function* gen() { yield 1; yield 2; } from(gen()); // 支持 AsyncIterable const stream new ReadableStream({...}); from(stream); // 支持 ReadableStreamReplaySubjectbug 修复官方修复了 PR #5696 指向的问题此前已完成或已报错的ReplaySubject在重订阅另一个源时不会在缓冲区中累积新值依赖此 bug 行为的代码——如某些 StackOverflow 答案中的用法——在 7.x 下行为变化属于预期内的修复。throwError支持错误工厂延迟创建错误throwError现在接受() any的errorFactory把错误的创建推迟到真正发出错误的时刻。官方推荐这种方式大多数主流 JS 运行时会为调试目的保留当前作用域的所有值提前创建的错误对象反而可能丢失栈信息。// 6.x立即创建错误 throwError(new Error(boom)); // 7.x 推荐延迟创建 throwError(() new Error(boom));一个极端角例也值得一提throwError不再能直接把函数当作错误发出。若要发出函数必须用工厂返回该函数throwError(() () console.log(called later))即工厂返回要发出的函数。rxjs/operators模块破坏性变更Breaking Changes时长类操作符complete 通知不再结束时长/缓冲区这是一组统一的语义修正audit、auditTime、bufferToggle、bufferWhen、debounce、debounceTime、delayWhen、sample、throttle、windowToggle以及buffer、window的边界通知此前complete 即可结束时长/关闭缓冲/触发取样7.x 一律改为必须收到 next 通知才生效操作符6.x 行为7.x 行为auditduration selector complete 即结束时长必须发出 next 才结束时长源 complete 时会发出最后一个值此前直接镜像 complete、丢失该值auditTime时长未到即镜像 complete源 complete 时等待审计时长过后发出最后一个值buffer先订阅 closing notifier缓冲尾值可能丢失notifier complete 会结束结果先订阅源再订阅 notifier最终缓冲值总是发出notifier complete 不再结束结果bufferToggle/bufferWhenselector complete 即关闭缓冲必须 next 才关闭缓冲debounceduration selector complete 即结束防抖必须 next 才结束防抖delayWhenselector 仅 complete 也会发出selector 必须发出值仅 complete 不再 emitsamplenotifier complete 也会触发取样必须 next 才触发取样throttleduration selector complete 即结束节流必须 next 才结束节流windowToggleclosing selector complete 即关窗必须 next 才关窗windowwindowBoundaries complete 会结束结果只作为窗口边界通知complete 不再结束结果buffer/window的等价迁移写法官方给出// 恢复notifier complete 结束结果的旧行为 source$.pipe( buffer(notifier$.pipe(endWith(true))), skipLast(1) ); // 若确实想要 notifier complete 结束结果也可显式 takeUntilnotifier$ 需多播 source$.pipe( buffer(notifier$), takeUntil(notifier$.pipe(ignoreElements(), endWith(true))) );debounceTime的实现效率说明7.x 的实现更高效不再为每个 next 通知调度一个 action而是使用调度器的时间概念。副作用是使用 Jasmineclock的测试需要在jasmine.clock().install()之后再调用jasmine.clock().mockDate()——因为 Jasmine 默认不 mockDate.now()。finalize回调顺序反转按管道顺序执行finalize会先退订源再调用回调。因此回调按在管道中出现的顺序执行source.pipe( finalize(() console.log(1)), finalize(() console.log(2)) ); // 7.x 输出1 然后 26.x 为 2 然后 1map的thisArg默认值thisArg默认改为undefined旧默认值MapSubscriber毫无意义属于泄露实现细节。仅影响这类写法source.pipe(map(function () { console.log(this); })); // 7.x 中 this 为 undefined官方评估破坏面极小——用 map 的 this 本来就没任何有用的用途。count不再把源作为谓词第三参数count的谓词不再接收source作为第三个参数。需要源时在函数内闭包引用即可// 6.xcount((value, index, source) ...) // 7.x let sourceRef; const result source$.pipe( count((value, index) { /* 用闭包中的 sourceRef */ }) );运行时参数校验7.x 为若干操作符增加了运行时断言take负数或NaN参数包括非 TS 调用如take()抛出运行时错误takeLast无参数或NaN参数抛TypeErrorskipLast负数不再报错而是等价于传0直接返回源single值不存在或不匹配谓词时抛错且错误类型已更新可查文档确认新错误类型如EmptyError/SequenceError相关变化。defaultIfEmpty必须传值defaultIfEmpty现在要求必须传值不再无故把undefined转成null。mergeScan完成时不重发内部状态mergeScan在源 complete 时不再把内部 accumulator 状态再次发出。zip操作符迭代器视为推送流zip操作符不再按需迭代传入的 iterable而是像 RxJS 中其他地方一样把 iterable 当作推送流。传入无穷 iterable 会导致线程卡死它会不断尝试读取。这与其它 Rx 实现保持一致。绕开方式用map或mapzip组合// 旧zip(source$, iterator) // 新 source$.pipe(map(value [value, iterator.next().value]));泛型签名变更同rxjs模块rxjs/operators下同样有一批操作符泛型签名改变、勿显式传泛型combineLatest、concat、concatAll、concatMapTo、endWith、expand、merge、mergeAll、pluck、race、reduce、scan、startWith、switchAll、switchMapTo、withLatestFrom、zip。其中concat、merge、zip三个操作符仍被弃用分别改用concatWith、mergeWith、zipWith。throwError操作符无法直接发出函数与rxjs模块的throwError一致不能直接发出函数作为错误需用工厂返回函数throwError(() () console.log(called later))。rxjs/operators模块新特性New Featuresconnectselector 形式的 publish 变体替代品新的connect操作符覆盖了使用 selector的publish变体用例selector 允许用户在连接到源之前定义多播行为。其符号导出与测试见 connect.ts 与 connect.spec.tsimport { connect, mergeMap, Subject, interval } from rxjs; source$.pipe( connect((shared$) shared$.pipe(mergeMap(x /* ... */))) );shareSubject 类型与重置时机的全配置share增强为可完整配置用哪种Subject多播、何时重置该 Subject。源码 share.ts 中的ShareConfig与官方文档完全对应connector?: () SubjectLikeT多播用 Subject 工厂默认() new SubjectT()resetOnError?: boolean | (error) ObservableValueany出错后是否重置默认trueresetOnComplete?: boolean | (() ObservableValueany)完成后是否重置默认trueresetOnRefCountZero?: boolean | (() ObservableValueany)引用计数归零后是否重置默认true。source$.pipe( share({ connector: () new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: true, }) );仓库的等价性测试 multicasting-deprecations.spec.ts 用expectObservable(...).toEqual(...)验证了multicast(() new Subject()) refCount()≡share()multicast(new Subject()) refCount()≡share({ resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })publishLast() refCount()≡share({ connector: () new AsyncSubject(), ... })。这说明share正是旧多播组合的现代化等价物。timeout更细粒度的超时配置timeout新增多种配置源码 timeout.ts 与文档一致first?: number | Date仅对第一个值到达前设超时可传Date对象表示绝对时间each?: number每个值之间的间隔超时with?: (info: TimeoutInfoT, M) ObservableValueW超时后切换到哪个 Observable默认产生TimeoutErrormeta?: M随超时携带的元数据用于标识是哪个超时触发便于排查超时错误对象会携带meta、lastValue、seen等信息。source$.pipe( timeout({ first: 1000, // 1 秒内必须有第一个值 each: 500, // 之后每个值间隔不超过 500ms meta: { id: http-1 } // 便于识别是哪个请求超时 }) );zipWith、concatWith、mergeWith、raceWith这四个是zip、concat、merge、race操作符的更名版本用于弃用旧名且不产生冲突。仓库中zipWith已有符号导出见 zip-with.ts// 旧source$.pipe(merge(other$)) // 新 source$.pipe(mergeWith(other$));rxjs/ajax模块变更详解破坏性变更ajaxbody 序列化重要body 为Blob、ArrayBuffer、任意数组缓冲视图如Uint8Array等字节序列、FormData、URLSearchParams、string或ReadableStream时走 XHR 默认处理body 是typeof object的其它对象时用JSON.stringify转 JSON并把Content-Type设为application/json;charsetutf-8其它类型一律报错。Content-Type头不再影响序列化行为此前通过配置头来影响序列化的写法失效序列化只由 body 类型决定。类型体系调整创建ajax的配置类型从AjaxRequest改为AjaxConfig两者兼容但只有AjaxConfig拥有progressSubscriber和createXHR。AjaxRequest保留但属性已变用于描述事件响应中实际发送的最终请求信息两者职责被明确分离。IE 支持ajax实现放弃 IE10 及更低版本支持与其他实现保持一致并清理了大量相关代码。新特性AjaxResponse新增responseHeaders新增事件type与total数值用于查看上传/下载进度配合下面的 flag。includeUploadProgress让返回的 Observable 包含流式上传进度事件。includeDownloadProgress让返回的 Observable 包含流式下载进度事件。queryParams在请求 URL 中设置查询参数。XSRFCSRF支持新增xsrfCookieName与xsrfHeaderName用于跨站请求伪造防护。import { ajax } from rxjs/ajax; ajax({ url: /api/data, method: POST, body: { hello: world }, // 自动 JSON.stringify Content-Type queryParams: { page: 1 }, // 拼接到 URL includeDownloadProgress: true, // 接收进度事件 xsrfCookieName: XSRF-TOKEN, xsrfHeaderName: X-XSRF-TOKEN, });仓库测试 ajax.spec.ts 展示了 ajax 在冷/平台两种模式下的行为契约超时、错误结构{ status, xhr }等可据此核对迁移后的行为。rxjs/fetch模块官方清单明确No changes无任何变更。rxjs/testing模块新特性TestSchedulerexpectObservable().toEqual()新增比较两个 Observable 相等性的方式若所有发出的值相同、且发出的时间相同则二者相等。主要用于重构操作符链后验证行为等价import { TestScheduler } from rxjs/testing; const scheduler new TestScheduler((actual, expected) { // 自定义断言如 chai/expect 的 deep equal }); scheduler.run(({ cold, expectObservable }) { const source cold(----a---b---c----|); const old source.pipe(/* 旧实现 */); const updated source.pipe(/* 新实现 */); expectObservable(updated).toEqual(old); // 行为等价校验 });仓库中 multicasting-deprecations.spec.ts 正是用这一 API 证明multicast/publish系列与share的等价性——这是 6→7 迁移时验证行为未变的标准手段。迁移实战清单综合官方文档与仓库证据一条务实的 6→7 迁移路径是先跑测试基线升级依赖前确保 6.x 测试全绿packages/rxjs的pnpm run test可参考其配置见 package.json。按本文清单扫描代码把import按rxjs/rxjs/operators/rxjs/ajax/rxjs/testing分组逐项对照上文的破坏性变更表。优先处理编译期问题移除_subscribe/_isScalar/_parentOrParents/syncError*等内部字段访问去掉所有显式泛型Subscription.add返回值依赖改为remove(fn)Subscribable.subscribe(fn)改为传Observer对象BehaviorSubject.value赋值改为通过next()。替换弃用 APItoPromise()→firstValueFrom/lastValueFrompairs()→from(Object.entries(obj))multicast/publish组合 →share/connectable/connect操作符concat/merge/zip/race→concatWith/mergeWith/zipWith/raceWiththrowError(err)→throwError(() err)。行为语义回归重点核对时长类操作符audit/debounce/throttle/sample/delayWhen/buffer 族/window 族——把所有complete 结束改为next 结束的语义落到测试断言里用expectObservable().toEqual()做行为等价性验证。长期演进本仓库当前的 RxJS 开发版本packages/rxjs/package.json中为9.0.0-beta.0采用 Symbol 化的平台 Observable 架构的迁移路径见 packages/rxjs/MIGRATION.md先让 7.x 基线全绿、盘点所有受影响面导入来源、scheduler 使用、Subscription捕获值、自定义 subscribable、Observable 子类再逐条选择目标生命周期契约并记录证据。本文档中的 6→7 知识尤其是行为语义层面是理解这些演进的基础。参考与进一步阅读官方变更清单原文档apps/rxjs.dev/content/6-to-7-change-summary.mdtoPromise弃用与firstValueFrom/lastValueFrom详解apps/rxjs.dev/content/deprecations/to-promise.mdRxJS 7 → 9 迁移指南packages/rxjs/MIGRATION.md核心实现源码connectable.ts、share.ts、timeout.ts、animation-frames.ts、empty-error.ts、zip-with.ts行为等价性测试范例multicasting-deprecations.spec.ts、ajax.spec.ts、connectable.spec.ts【免费下载链接】rxjsA reactive programming library for JavaScript项目地址: https://gitcode.com/gh_mirrors/rx/rxjs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价