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)();
我想做坏事并将TypeScript编译中的Function原型扩展到ES6。虽然此代码在TypeScript Playground中运行良好,但它在tsc 1.8.10中失败(属性<<name>>
在类型&#39;函数&#39;)上不存在,因为它无法与{{中的函数定义合并3}}
任何想法如何正确地做到这一点?
答案 0 :(得分:2)
根据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