TypeScript中组合模式无法访问SteamSession实例属性,继承引发循环依赖的问题求助
TypeScript中组合模式无法访问SteamSession实例属性,继承引发循环依赖的问题求助
嘿,我明白你的困扰了——用组合的时候拿不到SteamSession的cookies,换成继承又触发了循环依赖,确实挺头疼的。咱们先拆解下问题出在哪,再一步步解决:
问题根源分析
你现在的代码里,Listing实例和SteamSession实例是完全独立的:SteamSession创建了Listing,但Listing根本不知道自己属于哪个Session,所以调用getListings()时,this指向的是Listing自身,自然找不到cookies属性,才会输出undefined。而继承方案里两个类互相导入,TypeScript就会陷入循环引用的死循环。
解决方案:给Listing注入SteamSession实例
咱们可以用依赖注入的思路,在创建Listing的时候把当前的SteamSession实例传进去,让Listing持有Session的引用,这样既能访问到cookies,又不会产生循环依赖。
修改后的SteamSession代码
const Listing = require('./listing'); class SteamSession { public listingObj; public cookies: string; constructor() { // 创建Listing时把当前Session实例传进去 this.listingObj = new Listing(this); } setCookies(cookies: string) { this.cookies = cookies; } } module.exports = SteamSession;
修改后的Listing代码
class Listing { // 保存SteamSession的实例引用 private session; constructor(session) { this.session = session; } getListings() { console.log("Fetching Steam Session Listings"); // 通过session实例访问cookies console.log(this.session.cookies); } } module.exports = Listing;
主文件代码无需修改
运行之后,你会发现第二个console.log就能正常输出设置的cookies了!
TypeScript下的优化(彻底避免循环依赖)
如果是用TypeScript开发,咱们可以用import type来导入类型,只在编译时做类型检查,不会产生运行时的导入,彻底解决循环依赖的隐患:
SteamSession.ts
import Listing from './listing'; export class SteamSession { public listingObj: Listing; public cookies?: string; constructor() { this.listingObj = new Listing(this); } setCookies(cookies: string) { this.cookies = cookies; } } export default SteamSession;
Listing.ts
// 只导入SteamSession的类型,不会触发运行时导入 import type { SteamSession } from './steamSession'; class Listing { private session: SteamSession; constructor(session: SteamSession) { this.session = session; } getListings() { console.log("Fetching Steam Session Listings"); console.log(this.session.cookies); } } export default Listing;
为什么这个方案符合你的业务场景?
你的Steam Bot里,SteamSession是所有操作的基础,Listing确实不能脱离Session存在——现在的实现正好满足:创建SteamSession时自动创建关联的Listing,Listing依赖Session实例才能工作,既保持了代码的模块化(不同类负责不同业务),又解决了属性访问和循环依赖的问题。
备注:内容来源于stack exchange,提问作者Limes
相关产品推荐
相关产品推荐

