【问题标题】:How to update a class variable in TypeScript?如何更新 TypeScript 中的类变量?
【发布时间】:2022-02-15 07:54:33
【问题描述】:

我正在尝试创建一个包装 WebSocket 并充当摄取器的类。

我的摄取工作正常,我可以通过一个处理传入消息的公共函数将一个函数传递给类实例。

但是,我想进行特定调用以从 WS 中提取信息并使用该数据来更新该类的成员。我一直遇到静态错误和类似的事情,不知道该怎么做。

最初我刚刚设置了要在类之外更新的变量,但这意味着每个实例的变量都不会不同。如何将这个变量存储在类中 - 每个实例,同时允许我对其进行更改?

export class WebSocketWrapper {
    private _webSocket: WebSocketType;
    private _myVariableToUpdate: number;

    constructor(webSocket: WebSocketType) {
        this._webSocket = webSocket;
        setInterval(updateVariable, 5000);
    }

    // This gives problems
    private updateVariable() {
        this._myVariableToUpdate = this._webSocket.getMyVariable();
    }

    // This works
    public onXXX(handler: Function): void {
        this._webSocket.on("XXX", (value) => {
            this._webSocket.doSomething(value).then((v) => {
                handler(myValue);
            });
        });
    }
}

【问题讨论】:

  • “这会带来问题” 什么问题?描述不希望发生的事情。您是否收到特定的错误消息?如果是这样,请将确切的错误消息添加到您的问题中。你的代码会做一些意想不到的事情吗?如果是,请描述错误行为。

标签: node.js typescript class websocket


【解决方案1】:

从表面上看,可能有几个问题。

首先,您很可能触发了strictPropertyInitialization 错误。这是因为属性_myVariableToUpdate 没有直接在构造函数中初始化。为了解决这个问题,您需要让 typescript 知道您正在使用 non-null assertion operator 以其他方式对其进行初始化:

private _myVariableToUpdate: number;

应该变成

private _myVariableToUpdate!: number;

其次,在构造函数中,你指的是一个实例方法,没有使用this关键字。

setInterval(updateVariable, 5000);

应该变成

setInterval(this.updateVariable, 5000);

因此,有了这些更改,您的课程将变为以下内容:

export class WebSocketWrapper {
    private _webSocket: WebSocketType;
    private _myVariableToUpdate!: number;

    constructor(webSocket: WebSocketType) {
        this._webSocket = webSocket;
        setInterval(this.updateVariable, 5000);
    }

    private updateVariable() {
        this._myVariableToUpdate = this._webSocket.getMyVariable();
    }

    public onXXX(handler: Function): void {
        this._webSocket.on("XXX", (value) => {
            this._webSocket.doSomething(value).then((v) => {
                handler(myValue);
            });
        });
    }
}

编辑:

为了更好的类型安全,我实际上要么将_myVariableToUpdate 声明为

private _myVariableToUpdate?: number;

或者,在立即触发的构造函数中再次调用this.updateVariable

this.updateVariable();
setInterval(this.updateVariable, 5000);

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 2016-08-19
    • 2019-11-26
    • 2019-05-02
    • 2020-04-13
    • 2015-03-01
    • 2016-06-03
    • 2020-08-02
    相关资源
    最近更新 更多