2016-08-19 62 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)(); 

我想做壞事,並擴展函數原型在TypeScript編譯爲ES6。雖然此代碼在TypeScript Playground中運行良好,但它在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

請參閱我已確認的編輯作品。 – 2016-08-19 12:53:20

+0

src/utils/Function.augment.ts(13,15):錯誤TS2339:'Function'類型中不存在'call'屬性。 – m1gu3l