リリース 0.4 の準備

2232 ワード

前回の投稿では、プロジェクト、問題、およびオンライン ディスカッションについて話しました.この投稿では、進行中の問題と 1 週間後の進捗状況について説明します.

最低限カバーすべきポイント


  • 型レベルの等価演算子があります.
  • TypeScript 型システムは非常に機能的です.
  • タイプ レベルのテストが必要です.
  • ただし、型の等価性を簡単に確認することはできません.

  • 困難


  • == 演算子がないものと比較する方法
  • 単純に値を比較するのではなく、型を比較しています.

  • ==演算子がないので、私にとって最初の質問
    どうやって比較するのですか?問題の作成者 ( reference ) によって言及された参照の 1 つで、このレベルでの比較と型の比較は適切な使用によって実行できることがわかりました extends .コードスニペットは次のとおりです.

    (<G>() => G extends T ? 1 : 2)
    


    ここで、G と T は型であり、T の型と G を比較しています.

    さて、拡張の理解を 2 つの型を比較す​​るコードに実装するには、多くの時間がかかりました.
    実装されたコードは次のようになります.

    type isEqual<T, U> =
        (<G>() => G extends T ? 1 : 2) extends
        (<G>() => G extends U ? 1 : 2)
            ? true
            : false;
    


  • 現在、これはブール値を返しますが、エンド ユーザーが使用する関数が必要なため、関数が必要です.
    アサート機能を追加.
    アサート関数を追加すると、比較が肯定的な応答を返したかどうか、または意味がないかどうかがわかりました.
    これで、呼び出されたときに適切な応答が返されることがわかりましたが、問題は assert 関数を呼び出す方法でした.
    これは非常にトリッキーな部分でもあり、type isEqual を tis から呼び出して結果を取得できるようにするために、何百万もの試行錯誤機能を試しました.残念ながら、結果は得られませんでした.しかし、私が見つけたのは、最終的にエクスポートできる関数をもう 1 つ導入すると、この assert 関数を使用するとタスクが簡単になるということです.
    したがって、アサート関数の呼び出しは次のようになります

  • assertType<IsEqual<IsEqual<T, G>, true>>()
    


    isEqual を 2 回呼び出す必要がありました.
  • エクスポートする最終関数の書き込み
    この部分は上記の他の部分よりも簡単でしたが、typescript についての十分な知識も得られました.isEqualType という同じ名前の関数を作成してエクスポートする必要がありました.このように関数を書くのは初めての経験であり、私にとって貴重なものでした.
    検索機能は次のようになります.

  • export function isEqualType<T, G>(): boolean;
    export function isEqualType<T, G>(value : G): boolean;
    export function isEqualType<T, G>(a: T, b: G){
        return assertType<IsEqual<IsEqual<T, G>, true>>();
    } 
    


    私は今、この問題の完成に非常に近づいています.