Объявление типа '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) {
//...
});
Больше информации здесь
Ответ 3
Эта функция теперь доступна в TS 2.0. См. Https://github.com/Microsoft/TypeScript/pull/6739.
Ответ 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) {
});
который работает нормально. Это будет иметь последствия, например, неспособность писать функции стрелок...