Alexander Mills
Alexander Mills

Reputation: 100210

declare 'this' value for helper function

I have a class:

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);
 }

}

the problem is, in the helper function, it doesn't know what the context is (what the value of 'this' is).

Is there a way for me to tell typescript that the value for this in the helper function is an instance of Foo?

(the reason I use the helper function is to create true private methods).

Upvotes: 0

Views: 49

Answers (2)

Titian Cernicova-Dragomir
Titian Cernicova-Dragomir

Reputation: 250106

You can declare the type of this for any function by adding an extra parameter named this. The this parameter will not be emitted to Javascript, it will be just for the benefit of the compiler to be able to type check your code:

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

This will not however break encapsulation, you will still not be able to access private properties from outside the class, so unless you create the function inside the class it will still give an error as above. For functions defined inside the class it will not give errors:

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);
    }

}

Upvotes: 1

Jeto
Jeto

Reputation: 14927

Try adding this on top of your helper function:

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

Alternatively, you could replace all instances of this in it with (this as Foo).

Upvotes: 1

Related Questions