在前端开发中,尤其是使用 Babylon.js 这类框架 / 库时,我们经常会遇到 Observable(可观察对象) 与 Observer(观察者) 这对 “搭档”。它们是实现事件订阅、异步通信的核心模式,但开发者在实际使用中,很容易被一个问题困惑:回调函数的形参和 Observer<T> 中的 T 类型到底是什么关系?
比如之前有同学在 Babylon.js 中订阅 onBeforeRenderObservable 时,纠结 “回调函数没写形参,T 是不是就可以随便填?”,甚至因此出现类型错误。今天我们就从原理到实战,彻底讲清这个问题。
一、先搞懂:Observable 与 Observer 到底是什么关系?
在聊形参之前,我们得先明确 Observable 和 Observer 的核心职责 —— 它们本质是 “发布者 - 订阅者” 模式的具体实现:
- Observable(发布者):负责 “产生事件”。它就像一个广播电台,会在特定时机(比如 Babylon.js 中场景渲染前、模型销毁时)对外发送 “信号”,这个信号可能携带数据(比如当前场景实例、模型实例)。
- Observer(订阅者):负责 “接收事件”。它是一个包含回调函数的对象,通过
Observable.add()订阅发布者,当发布者发送信号时,Observer 的回调函数会被触发。
用一句话总结:Observer 是 “听广播的人”,Observable 是 “发广播的电台”;电台决定播什么内容(信号类型),听众可以选择听或不听(用或不用内容),但不能改变电台的内容类型。
二、关键误区:T 类型由回调函数形参决定?错!
很多开发者初次使用 Observer<T> 时,会下意识认为:“如果回调函数没写形参,T 就可以随便设;如果写了形参,T 就和形参类型一致”。但这是完全错误的 ——Observer<T> 中的 T 类型,只由 Observable 本身决定,与回调函数是否接收形参、接收什么形参无关。
1. T 类型的 “真正主人”:Observable
在 TypeScript 环境中,每个 Observable 都有明确的 “信号类型” 定义,比
厘清Observable与Observer的T类型关系

最低0.47元/天 解锁文章
1000

被折叠的 条评论
为什么被折叠?



