52

重複の可能性:
プロトタイプは typescript でどのように拡張されますか?

私は現在 TypeScript を学んでおり、既存のオブジェクトに機能を追加する方法を知りたいです。Foo の実装を String オブジェクトに追加したいとします。JavaScript では、次のようにします。

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

TypeScript のクラス、インターフェース、およびモジュールがオープンエンドであることを理解した結果、次のことを試してみましたが、成功しませんでした

1. TypeScript から JavaScript 実装を参照する

    JavaScript:

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

    TypeScript:

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

2.インターフェースを拡張する

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 メソッドを定義して実装するにはどうすればよいでしょうか?

4

1 に答える 1

66

私は解決策を見つけました。インターフェイスと JavaScript 実装の組み合わせが必要です。インターフェイスは TypeScript のコントラクトを提供し、新しいメソッドの可視性を許可します。JavaScript 実装は、メソッドが呼び出されたときに実行されるコードを提供します。

例:

interface String {
    foo(): number;
}

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

TypeScript 1.4 以降、静的メンバーも拡張できるようになりました。

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

String.bar = function(msg: string) {
    console.log("Example of static extension: " + msg);
}
于 2012-12-16T01:32:07.313 に答える