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

TypeScript中如何标记方法为必调用?解决Phaser.Scene初始化报错

解决Phaser场景类中TS2564错误的几种方案

针对你遇到的TS2564错误(属性未在构造函数中初始化),不用// @ts-ignore也能解决,以下是几种符合需求的方法,你可以根据情况选择:

1. 使用非空断言运算符(!)

直接在属性声明时添加!,告诉TypeScript这个属性一定会在某个时刻被初始化(你自行保证create方法会被调用),跳过初始化检查:

class Foo extends Phaser.Scene {
    // 添加!断言属性非空
    inventory!: Phaser.GameObjects.Text[]

    constructor(key: string) {
        super(key)
    }

    create() {
        // 注意这里要加this,否则会创建全局变量
        this.inventory = [this.add.text(10, 10, 'test')]
    }
}

这种方式最直接,完全满足你“自行承担风险”的需求,TypeScript不会再触发TS2564报错。

2. 声明属性为联合类型并初始化为undefined

如果不想用非空断言,也可以把属性类型设为目标类型 | undefined,并在构造函数里初始化为undefined:

class Foo extends Phaser.Scene {
    inventory: Phaser.GameObjects.Text[] | undefined = undefined

    constructor(key: string) {
        super(key)
    }

    create() {
        this.inventory = [this.add.text(10, 10, 'test')]
    }

    // 使用时若确定create已执行,可加!断言跳过检查
    someMethod() {
        this.inventory!.forEach(text => text.setColor('red'))
    }
}

这种方式需要在使用属性时额外加!,但好处是类型标注更严谨,能提醒你属性存在未初始化的可能性。

补充:修正代码中的小错误

你示例里的create方法中直接写inventory = [...]会创建全局变量,正确写法应该是this.inventory = [...],否则运行时会找不到类的inventory属性,这点要注意。

内容的提问来源于stack exchange,提问作者Aly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:25:03