2012-10-07 25 views
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")) 

結果:-e

The property 'proc' does not exist on value of type 'Function' 

TSCどのように私は、このオブジェクトを拡張していますか?

答えて

33

標準typescript libには、Functionオブジェクトのメンバーを宣言するFunctionインターフェイスがあります。あなたは次のように追加し、あなた自身でそのインターフェイスのメンバーとしてPROCを宣言する必要があります。

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

このインターフェースは、あなたが「PROC」を使用する予定のどこからでも参照する必要があります。

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

それは動作しません 'グローバル宣言' なし:このように

+0

thx!、それは動作します! – mizchi

+10

答えに印を付けることを検討してください。 –

+1

独自のクラスでこれを行うにはどうすればいいですか? –

6

これは最近のTypeScriptバージョンでモジュール補強がどのように機能するかを示しています。 documentationを確認し、Module augmentationセクションまでスクロールします。

+0

私はあなたが理由を説明することができればいいと思うが、私はここで同じことを確認する。ありがとう! – Ludwik

+1

これは最近のTypeScriptバージョンでモジュール補強がどのように機能するかを示しています。スクロールダウン: https://www.typescriptlang.org/docs/handbook/declaration-merging.html – gaperton

0

多くの人がこの質問を見るので、問題のサンプルのようなプロトタイプを追加しないようにするために、これを追加します。次のようにそれを追加します。

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

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

理由は、あなたが直接プロトタイプにそれを追加した場合、その関数のインスタンスがのが終わっ列挙得れば、それは列挙得る可能性があります。 for i in ..。今では、このブロックは制御できないコード(最近私に起こった)にある可能性があるので、コードをできるだけ安全に保つことが最善です。

関連する問題