Объявление типа 'this' в функции typescript?

Я пишу задачу grunt в TypeScript. Я пытаюсь перевести что-то, что у меня уже есть в JavaScript.

Итак, когда grunt запускает задачу, она запускает функцию. Когда он запускается, grunt устанавливает this объекту с полезными свойствами, точно так же, как jQuery перегружает this элементом, над которым вы работаете. Я мог получить доступ к полезным свойствам, например this.files;

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

Итак, "удалите все файлы в this.files".

Однако, в TypeScript, я не знаю, можете ли вы "намекнуть" на компилятор, что this является определенным типом, поэтому я не получаю intellisense. Как сообщить TypeScript считать this другим типом?

Ответ 1

Как я могу сказать TypeScript считать это другим типом

Для этого пока нет специального синтаксиса, но есть разговоры об этом: https://github.com/Microsoft/TypeScript/issues/229

Теперь то, что вы сделали, является единственным способом, хотя я бы не использовал утверждение и просто использовал аннотацию типа:

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

});

Ответ 2

Теперь (из TS 2.0) вы можете указать функцию this типа, используя fake this параметр (должен быть первым):

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

Больше информации здесь

Ответ 4

Пока я обнаружил, что теперь возможно с этим:

class ClassyClass {
    prop = 'Juicy Strings'
}

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

Я предпочел альтернативу, которая не занимает недвижимость в строке аргументов

function x() {
    const that: ClassyClass = this

    console.log( that.prop )
}

Ответ 5

У меня есть немного ответа. Я могу это сделать;

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

});

который работает нормально. Это будет иметь последствия, например, неспособность писать функции стрелок...