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

голоса
15

я продлил прототип функции, но машинописный не признает.

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'

как я продлить этот объект?

Задан 07/10/2012 в 05:27
источник пользователем
На других языках...                            


4 ответов

голоса
33

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

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

Этот интерфейс нужно будет ссылаться в любом месте вы собираетесь использовать «процедурный».

Ответил 07/10/2012 в 19:03
источник пользователем

голоса
6

Как это:

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

Без «объявить глобальный», это не работает.

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

Ответил 25/06/2016 в 05:00
источник пользователем

голоса
0

Просто добавив , что если вы пытаетесь добавить определить то , что уже объявлено, то это типизированный способ сделать так, что также защищает от багги for inреализаций.

export const augment = <U extends (string|symbol), T extends {[key :string] :any}>(
    type  :new (...args :any[]) => T,
    name  :U,
    value :U extends string ? T[U] : any
) => {
    Object.defineProperty(type.prototype, name, {writable:true, enumerable:false, value});
};

Который может быть использован для безопасного polyfill. пример

//IE doesn't have NodeList.forEach()
if (!NodeList.prototype.forEach) {
    //this errors, we forgot about index & thisArg!
    const broken = function(this :NodeList, func :(node :Node, list :NodeList) => void) {
        for (const node of this) {
            func(node, this);
        }
    };
    augment(NodeList, 'forEach', broken);

    //better!
    const fixed = function(this :NodeList, func :(node :Node, index :number, list :NodeList) => void, thisArg :any) {
        let index = 0;
        for (const node of this) {
            func.call(thisArg, node, index++, this);
        }
    };
    augment(NodeList, 'forEach', fixed);
}

К сожалению , это не может typecheck ваших символов из - за ограничения в текущих TS , и он не будет кричать на вас , если строка не соответствует ни одному определения по какой - то причине, я сообщить об ошибке после просмотра , если они уже осознанный.

Ответил 26/03/2019 в 02:25
источник пользователем

голоса
0

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

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

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

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

Ответил 02/05/2017 в 22:52
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more