Declaring the type of 'this' in a typescript function?

I'm writing a grunt task in TypeScript. I'm trying to translate something I already have in JavaScript.

So, when grunt runs a task, it runs a function. When it runs, grunt sets this to an object with useful properties, the same way that jQuery overloads this with the element you are working on. I could access useful properties like this.files;

grunt.registerMultiTask('clean', function() {
    this.files.forEach(function(f) { Delete(f); });
});

So, "delete all the files in this.files".

However, in TypeScript, I don't know if you can 'hint' to the compiler that this is a particular type, so I don't get intellisense. How do I tell TypeScript to consider this to be a different type?


Now (from TS 2.0) you can specify function's this type by using fake this parameter (should be the first one):

grunt.registerMultiTask('clean', function(this: SomeType) {
    //...
});

this parameters are fake parameters that come first in the parameter list of a function

More info here


How do I tell TypeScript to consider this to be a different type

You can do that by declaring a this parameter. For your use case I've added this: {files:any[]}:

grunt.registerMultiTask('clean', function(this: {files:any[]}) {
    this.files.forEach(function(f) { Delete(f); });
});

More

  • Official docs on this parameter

While I found that is now possible with this:

class ClassyClass {
    prop = 'Juicy Strings'
}

function x( this: ClassyClass ) {
    console.log( this.prop )
}

I have come prefer an alternative that doesn't take up real estate in the arguments line

function x() {
    const that: ClassyClass = this

    console.log( that.prop )
}