【问题标题】:declare 'this' value for helper function为辅助函数声明“this”值
【发布时间】:2018-03-17 00:29:42
【问题描述】:

我有一堂课:

const helper = function(val){
   console.log(this.a);
   console.log(this.b);
   this.bar();
};

export class Foo {

 public b = '45'
 private a = 15;

 bar(){

 }

 myMethod(){
    return helper.apply(this,arguments);
 }

}

问题是,在辅助函数中,它不知道上下文是什么('this' 的值是什么)。

我有没有办法告诉 typescript 辅助函数中 this 的值是 Foo 的一个实例?

(我使用辅助函数的原因是创建真正的私有方法)。

【问题讨论】:

  • 这是一个 StackBlitz:stackblitz.com/edit/angular-dzmfb1(这是一个 Angular,但我只是在这里使用 main.ts 作为打字稿文件)。检查浏览器控制台,它的行为似乎如您所愿。
  • 这在运行时工作(自然)......但在编译时,TS 不知道 this 是什么(它无法知道,因为它是动态的,除非你告诉 TS 它始终是一种类型)
  • let self: Foo = this as Foo; 然后使用self 呢?也可以在每次使用时将this 替换为(this as Foo)
  • @zerkms 我试过了,它说t 的私有方法/成员不能被t 访问,即使它被声明为Foo,la脚!
  • 哦,对了。所以你想要一个在 JS 运行时不可用的私有方法,我明白了。

标签: node.js typescript typescript2.0 tsc


【解决方案1】:

尝试在你的辅助函数之上添加这个:

let self: Foo = this as Foo;
// use self instead of this below

或者,您可以将其中的所有this 实例替换为(this as Foo)

【讨论】:

    【解决方案2】:

    您可以通过添加一个名为this 的额外参数来为任何function 声明this 的类型。 this 参数不会发送到 Javascript,只是为了让编译器能够对您的代码进行类型检查:

    const helper = function(this: Foo, val: number){
        console.log(this.a); /// error a is private
        console.log(this.b);
        this.bar();
     };
    

    但是这不会破坏封装,你仍然不能从类外部访问私有属性,所以除非你在类内部创建函数,否则它仍然会出现上述错误。对于在类中定义的函数,它不会报错:

    export class Foo {
    
        public b = '45'
        private a = 15;
        bar() { }
        createHelper() {
            return function (this: Foo, val: number) {
                console.log(this.a);
                console.log(this.b);
                this.bar();
            };
        }
    
        myMethod() {
            return this.createHelper().apply(this, arguments);
        }
    
    }
    

    【讨论】:

    • @AlexanderMills 我不会发布未经测试的代码,它会编译 ;)
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多