在typescript中访问不带“this”关键字的类型属性

fae0ux8s  于 2023-05-30  发布在  TypeScript
关注(0)|答案(3)|浏览(207)

我有这样的代码片段:

class Player implements OthelloPlayer {

    depth;

    constructor(depth: number) {        
        this.depth = depth;
    }

    getMove(state: OthelloState) {
        return this.MinimaxDecision(state, this.depth);
    }
}

我想调用MinimaxDecision而不使用'this'关键字。这样做的目的是避免丢失窗口或另一个对象的“this”上下文--这在从另一个类或函数调用方法时经常发生。

1u4esq0p

1u4esq0p1#

您可以将getMove方法更改为一个属性,该属性被分配一个箭头函数以保留this的值:

class Player implements OthelloPlayer {
    constructor(public depth: number) {        
    }

    getMove = (state: OthelloState) => {
        return this.MinimaxDecision(state, this.depth);
    };
}

注:上面的代码会有一个编译错误,因为没有定义MinimaxDecision。你可以按照自己的意愿来定义它。
这样做可以确保getMove中的this的值将成为类的示例,因为它转换为以下代码(注意this是如何存储的,然后在getMove中使用):

var Player = (function () {
    function Player(depth) {
        var _this = this;
        this.depth = depth;
        this.getMove = function (state) {
            return _this.MinimaxDecision(state, _this.depth);
        };
    }
    return Player;
})();

如果你不想使用一个箭头函数的属性,那么不要像这样做语句…

let player = new Player(10);
someObject.onClick = player.getMove;

做...

let player = new Player(10);
someObject.onClick = () => player.getMove();
pepwfjgg

pepwfjgg2#

调用类成员时不能松开“this”。您可以在任何地方使用fat arrow functions。他们解决了所有“这个”问题。
例如:

function Person(){
  this.age = 0;

  setInterval(() => {
    this.age++; // |this| properly refers to the person object
  }, 1000);
}

var p = new Person();
cbeh67ev

cbeh67ev3#

一种可能的方法是使用变量的外部声明-它将工作,但仅适用于单例(您仅限于使用类的一个示例,因为外部变量将在示例之间共享)。

let depth;
class Player implements OthelloPlayer {

    constructor(_depth: number) {        
        depth = _depth;
    }

    getMove(state: OthelloState) {
        return this.MinimaxDecision(state, depth);
    }
}

注意,这种解决方案不仅限于单例或静态类,而且可以被其他开发人员视为反模式和不良实践(因为它打破了封装范式)。
另一种更合适的解决方案是在方法开始时使用解构赋值:

class Player implements OthelloPlayer {
    
    depth;

    constructor(_depth: number) {        
        this.depth = depth;
    }

    getMove(state: OthelloState) {
        const { depth } = this; 

        return this.MinimaxDecision(state, depth);
    }
}

最奇特的解决方案是找到/编写自己的TS插件,它可以做你想要的。

相关问题