98

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?

Steve Cooper
  • 20,542
  • 15
  • 71
  • 88

4 Answers4

143

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

Aleksey L.
  • 35,047
  • 10
  • 74
  • 84
49

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

RedGuy11
  • 344
  • 6
  • 14
basarat
  • 261,912
  • 58
  • 460
  • 511
3

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 )
}
Jason
  • 779
  • 1
  • 9
  • 30
0

I have a bit of an answer. I can do this;

var self = <grunt.task.IMultiTask<string>>this;
self.files.forEach(function (f) {

});

which works OK. It's gonna have consequences, like not being able to write arrow functions...

Steve Cooper
  • 20,542
  • 15
  • 71
  • 88
  • 2
    You an still write arrow functions, since they will close over the `self` variable. `this` in the arrow functions will still be incorrectly typed, but at least you can save a few characters! – Yourpalal Sep 05 '15 at 17:32