私がやりたいことは、モジュール内に ArrayExtension を配置する方法を理解しようとしていることを除いて、これとこれに非常に似ています。
私は、C# 拡張メソッドが機能する方法に似たものを取得しようとしています。そうすれば、モジュールをインポートするだけで、追加のメソッドを使用できます。私が提供したリンクは、既存のオブジェクトを拡張する方法を示していますが、それをモジュールにカプセル化する方法を理解できませんでした。
私がやりたいことは、モジュール内に ArrayExtension を配置する方法を理解しようとしていることを除いて、これとこれに非常に似ています。
私は、C# 拡張メソッドが機能する方法に似たものを取得しようとしています。そうすれば、モジュールをインポートするだけで、追加のメソッドを使用できます。私が提供したリンクは、既存のオブジェクトを拡張する方法を示していますが、それをモジュールにカプセル化する方法を理解できませんでした。
node.js のようなブラウザ以外の環境をターゲットにしている場合、これが可能になります。これは、モジュールのグローバル メンバー ( など) への参照を他のモジュールに渡すことができるためですArray
。これらの他のモジュールは、渡されたオブジェクトおよび/またはそのプロトタイプを、呼び出し元のモジュールのみがアクセスできる追加機能で拡張できます。これらの拡張機能を取得するには、他のモジュールも同じことを行う必要があります。したがって、インポートは明示的であるため、競合は最小限に抑えられます。
ただし、ブラウザー環境では、オブジェクトは 1 つしかなくwindow
、そのメンバーへの変更はどこでも利用できるため、これは当てはまりません。モジュールのいずれかが拡張されるとすぐに、Array
それらの拡張機能が他のすべてのモジュールで利用できるようになります。これにより、競合の可能性が高まり、コードの推論が難しくなります。
そうは言っても、JSにはパターンがあり、したがってTypeScriptはあなたが望むものを達成するはずです. そのようなパターンの 1 つは、オブジェクトインスタンスベースで追加機能を追加できる「mixin」パターンです。再利用可能なコードを mixin モジュールに分割し、必要に応じてオブジェクトに適用したり、コンストラクターで自動的に適用したりすることができます。適切な概要と実装例については、これをご覧ください: http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/
組み込みの Array 型を拡張しようとしている場合、モジュール内でそれを行うことはできません。拡張機能は ArrayEx.ts ファイルに存在し、モジュールの外部で発生する必要があります。Foo.Array
その理由は、モジュール内でそれを行った場合、 と同じではない型を拡張することになるからArray
です。
しかし、モジュールをインポートして追加のメソッドを表示できるようにしたいだけだとおっしゃいました。実際に必要なのは/// <reference path='ArrayEx.ts' />
、拡張メソッドを使用できるようにするファイルに a を追加することだけです。これは本質的に同じことです。