Подтвердить что ты не робот

Как прототип распространяется на typescript?

i прототип расширенной функции, но typescript не распознает его.

Function.prototype.proc = function() {
  var args, target, v;
  var __slice = [].slice;
  args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
  target = this;
  while (v = args.shift()) {
    target = target(v);
  }
  return target;
};
// generated by coffee-script

var foo: (number) => (string) => number
  = (a) => (b) => a * b.length;
console.log(foo.proc("first", "second"))

результат: tsc -e

The property 'proc' does not exist on value of type 'Function'

как я могу расширить этот объект?

4b9b3361

Ответ 1

В стандартной библиотеке typescript существует функциональный интерфейс, который объявляет члены объектов Function. Вам нужно будет объявить proc как член этого интерфейса с вашим собственным добавлением, как показано ниже:

interface Function {
    proc(...args: any[]): any;
}

Этот интерфейс нужно будет ссылаться из любого места, где вы собираетесь использовать "proc".

Ответ 2

Вот так:

declare global {
    interface Function {
        proc() : any;
    }
}

Без 'declare global' он не работает.

То, как расширение модуля работает в последних версиях TypeScript. Просмотрите документацию и прокрутите вниз до раздела Module augmentation.

Ответ 3

Я добавляю это, чтобы советовать не добавлять прототипы, как пример, показанный в вопросе, так как многие люди рассматривают этот вопрос. Добавьте его следующим образом:

interface Function {
    proc(...args: any[]): any;
}

Object.defineProperty(Function.prototype, 'proc', { value: function(arg: any[]) {
    // Your function body
}});

Причина в том, что если вы добавите его в прототип напрямую, он может быть перечислит, если экземпляр этой функции перечислит. for i in ... Теперь этот блок может быть в коде, который вы не контролируете (недавно случилось со мной), поэтому лучше всего держать ваш код как можно безопаснее.