2012-12-16 25 views
34

可能性の重複:
How does prototype extend on typescript?拡張機能

は、私は現在、活字体を勉強し、それを既存のオブジェクトに機能を追加することが可能である方法を知っていただきたいと思います。 Fooの実装をStringオブジェクトに追加したいとします。その活字体クラス、インターフェイスおよびモジュールが終了開いている理解

String.prototype.Foo = function() { 
    // DO THIS... 
} 

が成功

1.参照することなく、次のことをしようとする私を導い活字体

からJavaScript実装:JavaScriptでは、私はこれを行うだろう
JavaScript: 

    String.prototype.Foo = function() { 
     // DO THIS... 
    } 

    TypeScript: 

    var x = "Hello World"; 
    x.Foo(); //ERROR, Method does not exist 

2.インターフェース

を拡張0
interface String { 
    Foo(): number; 
} 

var x = "Hello World"; 
x.Foo(); //Exists but no implementation. 

3.あなたがこれまでのところ、私はどのように行う、インターフェース契約を経由してメソッドを追加することができたが、ない実装、そうしている、これらの結果から見ることができるように

class String { 
    Foo(): number { 
     return 0; 
    } 
} 

// ERROR: Duplicate identifier 'String' 

クラスを拡張既存のStringクラスの一部としてFooメソッドを定義して実装する方法はありますか?

答えて

48

解決策が見つかりました。これは、インターフェイスとJavaScript実装の組み合わせを取ります。このインタフェースはTypeScriptの契約を提供し、新しいメソッドの可視性を可能にします。 JavaScript実装は、メソッドの呼び出し時に実行されるコードを提供します。

例:活字体1.4のよう

interface String { 
    foo(): number; 
} 

String.prototype.foo= function() { 
    return 0; 
} 

あなたは今も、静的メンバを拡張することができます。

interface StringConstructor { 
    bar(msg: string): void; 
} 

String.bar = function(msg: string) { 
    console.log("Example of static extension: " + msg); 
} 
+2

はまさに、それがあることを意味する方法を説明します。 TypeScriptはそれ自身の言語ではなく、単なる構文的な砂糖であることを忘れないでください。だから、「JavaScriptスタイル」で何かを書くことは、欠点のない良い方法です。 –

+1

このソリューションは本当に** String **で動作しますか?私は_exact_同じことをやっているので、プロパティがString型に存在しないというコンパイルエラーが発生します。私は何が欠けていますか? (tsc 1.4.1を使用) – sebas2day

+0

@ sebas2dayはいそれは動作します - http://tinyurl.com/ouwh3ln – series0ne