TypeScript合并函数接口,扩展函数原型

时间:2016-08-19 10:14:02

标签: javascript function typescript ecmascript-6 prototype

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}}

任何想法如何正确地做到这一点?

1 个答案:

答案 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