将带有“this”的正确上下文从类传递到外部方法

Passing correct context with "this" to external method from class

提问人:Shannon Hochkins 提问时间:1/4/2023 最后编辑:Shannon Hochkins 更新时间:1/4/2023 访问量:267

问:

假设我有一个非常简单的类,它扩展了其他类,以及一个要传递给类 B 的函数对象

const actions = {
   doSomething: (this: B, foo: boolean) => {
      console.log('from do something', this.text, foo);
   }
}
class B {
  actions = actions;
  text: string;
  constructor() {
    this.text = 'abc';
  }
}
class A extends B {
   runAction(foo) {
      this.actions.doSomething(false);
   }
}


const instance = new A();
instance.runAction(); // 'from do something, undefined, false'

TS 编译器还说从内部调用时上下文不正确thisrunAction

有没有更好的方法可以做到这一点?

我们有 500 多个操作,我们希望为每个操作提供对类数据的访问,并且不希望通过所有操作传递参数。

JavaScript TypeScript 这个

评论

0赞 Shannon Hochkins 1/4/2023
对不起,@CertainPerformance,TS 编译器本身,我刚刚编辑了我的问题
0赞 Bergi 1/4/2023
"我们不想通过所有操作传递论点。- 你这是什么意思,?它不会比你目前拥有的长:-)actions.doSomething(this, false)
0赞 Bergi 1/4/2023
顺便说一句,这样做没有意义,除非您以后想更改实例应该使用的多个对象中的哪一个。只需直接引用静态常量即可。actions = actionsactionsB
0赞 Bergi 1/4/2023
为什么不简单地将操作定义为实例上的方法呢?
0赞 Shannon Hochkins 1/4/2023
因为@Bergi有 500 多个操作,类上有大量可用的数据,并且每个操作在可以使用的内容方面都不同,我必须为每个类别的操作定义一个类,而不是仅仅导出一个易于测试的函数对象的文件

答:

1赞 CertainPerformance 1/4/2023 #1

this.actions.doSomething(false);

使用 的 调用方法。但是是带有方法的普通对象 - 而不是实例本身。您将需要改用,以及将箭头函数更改为常规函数/方法,以便它可以捕获不同的 .参数也应该被键入(或删除)。thisthis.actionsthis.actionsdoSomething.calldoSomethingthisfoo

在里面打字也很有用,尽管并不总是必要的。thisrunAction

const actions = {
   doSomething(this: B, foo: boolean) {
      console.log('from do something', this.text, foo);
   }
}
class A extends B {
   runAction(this: A) {
      this.actions.doSomething.call(this, false);
   }
}

评论

0赞 Shannon Hochkins 1/4/2023
谢谢,这么简单,我应该知道这一点......