2016-12-10 9 views
4

コトルにはExtensionsと呼ばれる機能があり、実際にそれを拡張せずにあらゆるタイプ(組み込みタイプを含む)を「拡張」することができます。例えばTypeScriptにはKotlinのような拡張機能がありますか?

function Array<T>.swap(i1: number, i2: number) { 
    let tmp = this[i1] 
    this[i1] = this[i2] 
    this[i2] = tmp 
} 

let list = [1, 2, 3] 
list.swap(0, 2) 
console.log(list) // => 3, 2, 1 

楽しい部分は、ベースタイプの延通常とは異なり、このアプローチが配列又はそのプロトタイプチェーンを変更しない、ということです。私はそれが活字体で同じことを行うことが可能ですかしら、または将来的にこれをサポートする計画があるかどう

function _array_extensions_swap(i1, i2) { 
    let tmp = this[i1] 
    this[i1] = this[i2] 
    this[i2] = tmp 
} 

let list = [1, 2, 3] 
_array_extensions_swap(list, 0, 2) 
console.log(list) // => 3, 2, 1 

生成されたJSコードは次のようになりますか?

+0

私はそれが計画されていないことを推測するが、JavaScriptからあまり逸脱しているようです。 TypeScriptは、JavaScriptが将来的にその機能を利用することを期待して、JavaScriptに比較的近いとされています。私はあなたの質問があるべきだと思う:JavaScriptはこれを提供するか? –

答えて

0

このようなことはありません。将来的にはこれが起こるのではないかと疑いますが、その主な理由はこれには理由がないことです。あなたは、単に既存のインスタンスに新しいプロパティを追加することはできませんkotlinのようなコンパイル言語で
が、JavaScriptで(とtypescriptですaswellとそのための)あなたは、単に行うことができます。

let list = [1, 2, 3] as number[] & { swap(i1: number, i2: number): void }; 
list.swap = function (i1: number, i2: number) { 
    let tmp = this[i1] 
    this[i1] = this[i2] 
    this[i2] = tmp; 
} 

list.swap(0, 2); 
console.log(list); // [3, 2, 1] 

は、既存のリストを拡張するためのファクトリ関数を作成することができます:

function extend<T>(list: T[]): T[] & { swap(i1: number, i2: number): void } { 
    (list as T[] & { swap(i1: number, i2: number): void }).swap = function (i1: number, i2: number) { 
     let tmp = this[i1] 
     this[i1] = this[i2] 
     this[i2] = tmp; 
    } 

    return list as T[] & { swap(i1: number, i2: number): void }; 
} 

let list = extend([1, 2, 3]); 
list.swap(0, 2); 
console.log(list); // [3, 2, 1] 

code in playground

+0

実際にどのように使用する予定ですか?あなたのコードの配列のすべてのインスタンスに10から20のような関数を追加しようとしていますか?また、String.isBlank/isPresent/reverseなど... –

+0

改訂版の回答を確認してください。 'extend'関数は、あなたが望むものをインスタンスに追加することができます –

+0

これは、大きな欠点を持つよく知られたアプローチです。それはひどいパフォーマンス(すべての作成されたオブジェクトにたくさんの機能を格納する必要があります)を持ち、すべての配列/文字列などを明示的に拡張する必要があるため、かなり冗長です。 –

関連する問題