2017-01-02 10 views
2

注:これは私が非常に有用だと感じているように、他の人が使用するために自分自身で公開したい最初のモジュールです。 TypeScript用の型付きデータ直列化エンジンです。私はここで何をやるべきかについて少し失われています。私は決定的な答えが必要です。だから私はES6コレクション型、SetMapを使用していますnpmモジュールを作成しES6コレクションタイプのNPMモジュールを作成して公開する


...今日でジャンプをありがとう、とのは、それを取得しましょう。これらのコレクションの種類は次のとおりです。

  • が暗黙的に
  • 内部使用(クラスのプロパティとして)私の活字体/ ES7デコレータベースのAPIを介してサポート

    私のモジュールの内部実装を燃料に使用し
    • 私が理解している限り、私は単にpackage.jsonを通してそれらに依存し、それらを私のソースにインポートすることができるので、これらのタイプの多くは問題ではありません。それから私はすべて揃っている、彼らはいつもそこにいるだろう。一方に

      私がそうするならば、それは、(これらの輸入は、私がに頼るネイティブ地図/セットのオブジェクト(使用可能な場合)、および型の検出との競合を上書きすることを私の理解でありますこれらのインポートは、利用可能な場合はネイティブオブジェクトを生成しますか?)上記のタイプの検出について


      ...それは最高のを通じて実証されています - ユーザーが自分のモジュールでMapオブジェクトを使用した場合、これは、それがどのように行われるかである。

      // Consumer code. 
      class MapContainer { 
          @JsonMember 
          mapValues: Map<number, string>; 
      } 
      

      そして、これは地図が検出され、私のモジュール内をどのように処理されるかです:

      // Internal module code. 
      // Just for the sake of clarity: 'sourceValue === new MapContainer().mapValues' 
      if (sourceValue.constructor === Map) { 
          // Handle 'sourceValue' as a map object... 
      } 
      

      これがどのように競合を引き起こすのかは明らかです。これはまた別の問題です。ユーザがネイティブで使用可能な実装を使用する代わりに、importマップ/設定する場合、モジュールの内部コードで認識されません。

      この場合、依存関係はどのように定義する必要がありますか?

      • 単純に私のコードの中にいくつかの短いpolyfillsジャム、ユーザーは、彼らがすることができますどのような方法でそれを処理してみましょうか?
      • require('es6-map/implement')を使用しますか?このよう__Map__Setとして、私のソースの一部エイリアシングを通じて
      • インポートMapSet(どのように私は私のモジュールのユーザーがドキュメント/限界で、それを言及する以外にも、同じことを行うの?確実ん)、および文字列ベース」を使用コンストラクタ参照を比較するのではなく、「クラス名」の検出?(これは汚れているように見える)

    答えて

    1

    最初に、無条件に適用するポリフィルは、実際にはポリフィルではなく、ハック(zone.jsなど)です。うまく動作するポリフィルはフィーチャ検出を使用し、存在していない場合にのみグローバルを追加します。

    1. あなたは世界を増大させるのではなく、その機能をエクスポートpolyfillsを使用することができます。

      あなたは、本質的に3つのオプションがあります。この技術は、ポニーフィリングと呼ばれています。ポリ充填が果たすことを実際に達成していないので、少し恣意的です。それはネイティブな経験を提供しません。しかし、この方法の利点は、あなたが正しく選択のあなたの実装に依存することができますし、ユーザーが別の実装に頼ることができると2つの干渉しないということです。 このアプローチは、あなたが述べたように、あなたが特定のポリフィルにコミットする代わりに、単にあなたのライブラリーは、ES2015がSetMap関数が存在する準拠することを要求することを文書化しないというオプションを持っている

      import Map from 'es6-map'; // pony pure 
      
    2. ようになります。ユーザーは、さまざまなポリフィルから選択することができます。この利点は、ユーザーが別のポリフィルを使用したい場合、彼らはブラウザを対象とするプロジェクトのために重要である彼らのコードのサイズを大きくすることなく、そうすることができる、ということです。このオプションは、このオプション1.

    3. 別のアプローチは、単にそれを自分でポリフィルすることで行うことができない利用可能な場合、独自のコードがネイティブ実装の利点を活用することができます。これは、自分のコードがどのように構造化されているかという点で最も簡単なオプションですが、消費者とその依存関係との競合を引き起こす可能性が最も高いものです。オプション2と同様に、利用可能な場合はネイティブ実装を使用する利点があります。しかし、欠点があります。あなたは、ユーザーが必要とするかどうかにかかわらず、この機能を利用できるコストを支払わなければなりません。ユーザーは自分のライブラリーは自分のコードで利用できるようにするためにpolyfilled Mapを引き起こしていると暗黙的にそれに依存するようになって何であることを認識していなくてもよいです。ライブラリの他の依存関係との相対的な読み込み順序は、非常に奇妙で困難なバグを検出する可能性があります。このアプローチは、どのようにあなたの特定のユースケースに関連しない

      import 'es6-map/implement'; // mutate the global 
      

    のように見えるのでしょうか?これのほとんどはpolyfillingを必要とするかもしれない機能に依存しているすべてのライブラリに適用されますが、あなたがお勧めのように特に関連部品は、エイリアシングに関連しています。 文字列の比較に頼る必要はありません。

    代わりにあなたは(オプション1 ponyfillアプローチを)Mapをインポートする代わりに、それをpolyfillingしている場合、あなたはMapあなたの依存コードからキャプチャした値に、あなたの実装では、インポート、それがされるので、異なる基準と比較することはできません結果は一般的にfalseであり、確かに信頼できるものではありません。さらに、Mapサポート(polyfilledまたはnative)が組み込まれている環境で動作させたい場合は、Map識別子(sourceValue.constructor === Map)はその環境内のグローバルMapを参照する必要があります。

    それが最大の互換性を提供し、あなたが適切にあなたの依存関係を指定することができますので、私はオプション1をお勧めします。 これは、あなたがそれを使用どこ

    ローカルに作成されます
    import Map from 'es6-map'; 
    

    のように、Mapをインポートすることを意味します。グローバルMapとやりとりしているモジュールで使用する必要がある場合は、既に考慮したようにエイリアスでインポートする必要があります。

    世界に何Mapがない場合は、安全のために

    typeof Map !== 'undefined' && sourceValue.constructor === Map 
    

    ようなものでそれをチェックしたいと思うでしょうので

    sourceValue.constructor === Map 
    

    は、一部の環境でスローされますことは注目に値します。

    関係なく、必要に応じて同じ行に「{」と入力してください。これはJavaScriptで重要です。

    関連する問題