Как прототип распространяется на 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'
как я могу расширить этот объект?
Ответы
Ответ 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 ..
. Теперь этот блок может быть в коде, который вы не контролируете (недавно случилось со мной), поэтому лучше всего держать ваш код как можно безопаснее.