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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:54:36