2016-08-19 5 views
0
interface Function { 
    next(next: Function): Function; 
    prev(prev: Function): Function; 
} 

Function.prototype.next = function(next) { 
    const prev = this; 
    return function() { 
     return next.call(this, prev.apply(this, arguments)); 
    }; 
}; 

Function.prototype.prev = function(prev) { 
    const next = this; 
    return function() { 
     return next.call(this, prev.apply(this, arguments)); 
    }; 
}; 

const f1 = function() { console.log("f1"); }; 
const f2 =() => console.log("f2"); 
const f3 = new Function("console.log('f3');"); 

f1.next(f2).next(f3)(); 

Я хотел сделать что-то плохое и расширить прототип функции в компиляторе на языке ES6. Хотя этот код хорошо работает на игровой площадке TypeScript, он терпит неудачу в tsc 1.8.10 (свойство <<name>> не существует в типе «Функция»), поскольку оно не может слиться с определением функции в lib.es6.d.ts.Сглаживание TypeScript Функциональный интерфейс, продление Функциональный прототип

Любые идеи, как это сделать должным образом?

ответ

1

Согласно docs:

Аналогичным образом, глобальный масштаб может быть дополнен из модулей с использованием declare global декларации.

Обратите внимание на формулировку из модулей. Другими словами, добавьте дополнения в другой модуль и импортируйте их, то есть когда происходит слияние. Кроме того, поместите новые определения прототипов в один и тот же файл.

// augment.ts 
export {}; 

declare global { 
    interface Function { 
    next(next: Function): Function; 
    prev(prev: Function): Function; 
    } 
} 
Function.prototype.next = function(next) { 
    const prev = this; 
    return function() { 
    return next.call(this, prev.apply(this, arguments)); 
    }; 
}; 
Function.prototype.prev = function(prev) { 
    const next = this; 
    return function() { 
    return next.call(this, prev.apply(this, arguments)); 
    }; 
}; 


// test.ts 
import './augment'; 

const f1 = function() { console.log("f1"); }; 
const f2 =() => console.log("f2"); 
const f3 = new Function("console.log('f3');"); 

f1.next(f2).next(f3)(); 

Выход:

f1 
f2 
f3 
+0

Тогда TSC не видит методы, такие как вызов и применять, в основном все, что было объявлено в lib.es6.d.ts. Я хотел бы объединить эти определения. – m1gu3l

+0

См. Мое редактирование, которое я подтвердил. –

+0

src/utils/Function.augment.ts (13,15): ошибка TS2339: Property 'call' не существует в типе 'Function'. – m1gu3l

Смежные вопросы