ジェネリックパラメータにデフォルト値を与える方法は?

ストレブラー

私は次の機能を持っています:

function demo<T>(init: T) {
    return init;
}

省略した場合initのデフォルト値を指定したいと思います{}だから私は書いた:

function demo2<T>(init: T = {}) {
    return init;
}

しかしもちろん、これは私にエラーを与えます:

Type '{}' is not assignable to type 'T'.
  'T' could be instantiated with an arbitrary type which could be unrelated to '{}'.(2322)

遊び場へのリンク

どのように私は強制できTように{}パラメータが省略されたとき?ありがとうございました。

jcalz

エラーは技術的に正しいです。関数呼び出し元demo2()、typeパラメーターTを希望どおりに指定できますつまり、次のような呼び出しではコンパイラエラーは発生しませんが、ランタイムエラーが発生しやすくなります。

const z2 = demo2<{ a: number }>(); // uh oh, no error 
z2.a.toFixed(); // no error at compile time but "z2.a is undefined" at runtime

あなたが(手動でジェネリック型パラメータを指定する)ことをやって誰かの可能性は低いと思われる場合それでも、あなたは使用することができるタイプのアサーションを同時に使用している間、エラーを抑制するために、一般的なパラメータのデフォルトコンパイラが推測されるように{}するためにプロパティTを除外する場合init

// assertion with default type parameter
function demo3<T = {}>(init: T = {} as T) {
    return init;
}

これにより、次の望ましい動作が得られます。

const x3 = demo3(); // {}
const y3 = demo3({ a: 123 }); // {a: number}

それでも次の望ましくない動作を許可します。

const z3 = demo3<{ a: number }>(); // no compiler error
z3.a.toFixed(); // RUNTIME ERROR!

Tタイプの値を渡さずに手動で指定することを禁止したい場合は、複数の呼び出しシグネチャを持つオーバーロードされた関数のTようなものを使用することを検討してください

//オーバーロード

function demo4(): {};
function demo4<T>(init: T): T;
function demo4(init = {}) {
    return init;
}

ここで、呼び出し元がinitパラメーターを省略した場合、関数は汎用として扱われなくなります。戻り値の型はちょうど{}です。一方、呼び出し元がinitパラメーターを指定した場合、関数は元のdemo()関数と同じように扱われます関数の実装は、どちらの呼び出しシグネチャでも機能します。

これにより、「通常の」呼び出しの望ましい動作も得られます。

const x4 = demo4(); // {}
const y4 = demo4({ a: 123 }); // {a: number}

また、誰かがそれを間違った方法で呼び出そうとすると、コンパイラに警告を出します。

const z4 = demo4<{ a: number }>(); // compiler error! an argument for init is required

コードへの遊び場のリンク

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

KOTLIN:関数のジェネリック型パラメーターにデフォルトの値を割り当てる方法は?

分類Dev

Swaggerパラメータにデフォルト値を与える方法は?

分類Dev

Swaggerパラメータにデフォルト値を与える方法は?

分類Dev

Swaggerパラメータにデフォルト値を与える方法は?

分類Dev

TypeScript:デフォルトのジェネリックパラメーターで型を単純化する

分類Dev

Kotlinのデフォルトの関数戻り値のジェネリックパラメーター

分類Dev

TypeScriptジェネリックは拡張パラメータとデフォルトパラメータを制限します

分類Dev

Rustがデフォルトのジェネリックパラメータタイプを使用しない理由

分類Dev

デフォルトのジェネリック型パラメーターを推測できません

分類Dev

デフォルトのジェネリック型パラメーターを推測できません

分類Dev

同じTまたは異なるRの値を返すジェネリック関数は、デフォルトのパラメーター値として高階関数 '(i:T)=> i'を受け入れることができません。

分類Dev

Option :: Noneを使用するときに、ある種のデフォルトのジェネリック型を使用するようにコンパイラーにヒントを与える方法はありますか?

分類Dev

オブジェクトの破棄でネストされたデフォルトパラメータを処理する方法は?

分類Dev

ジェネリック型としてのデフォルトパラメータ

分類Dev

Springを使用しているときに、チェックスタイルメッセージ「ユーティリティクラスにデフォルトのパブリックコンストラクターを含めることはできません」を抑制する方法

分類Dev

タイプのデフォルトのジェネリックデリゲートを取得する方法

分類Dev

SpringBootリクエストパラメータで使用されるクラスのフィールド値にデフォルト値を設定する方法

分類Dev

ジェネリックにデフォルト値を割り当てる

分類Dev

Swift関数のオプションのジェネリックパラメーターのデフォルト値

分類Dev

フィールドのジェネリックパラメータのクラスを取得する方法

分類Dev

デフォルトパラメータを使用したジェネリックケースクラスのCirceエンコーダ

分類Dev

ジェネリック型パラメーターのデータ型を抽出する方法は?

分類Dev

Gsonシリアル化:ジェネリッククラスとジェネリックデータをその中にキャストする方法は?

分類Dev

共通のcreateValueメソッドを定義するパラメーターを持つケースクラスのシェイプレスのジェネリックデフォルトインスタンスを使用してビルドします

分類Dev

ジェネリックではないジェネリックパラメータを実装する方法

分類Dev

PowerShellにスクリプトパラメーターのデフォルト値を取得する方法はありますか?

分類Dev

ジェネリックパラメーターの「デフォルト引数」をシミュレートできますか?

分類Dev

F#ジェネリックジェネリックコンストラクトでは、タイプ 'struct(Guid * int)'にパブリックデフォルトコンストラクターが必要です。

分類Dev

デフォルトの引数でラムダを取るジェネリック関数を書く方法は?

Related 関連記事

  1. 1

    KOTLIN:関数のジェネリック型パラメーターにデフォルトの値を割り当てる方法は?

  2. 2

    Swaggerパラメータにデフォルト値を与える方法は?

  3. 3

    Swaggerパラメータにデフォルト値を与える方法は?

  4. 4

    Swaggerパラメータにデフォルト値を与える方法は?

  5. 5

    TypeScript:デフォルトのジェネリックパラメーターで型を単純化する

  6. 6

    Kotlinのデフォルトの関数戻り値のジェネリックパラメーター

  7. 7

    TypeScriptジェネリックは拡張パラメータとデフォルトパラメータを制限します

  8. 8

    Rustがデフォルトのジェネリックパラメータタイプを使用しない理由

  9. 9

    デフォルトのジェネリック型パラメーターを推測できません

  10. 10

    デフォルトのジェネリック型パラメーターを推測できません

  11. 11

    同じTまたは異なるRの値を返すジェネリック関数は、デフォルトのパラメーター値として高階関数 '(i:T)=> i'を受け入れることができません。

  12. 12

    Option :: Noneを使用するときに、ある種のデフォルトのジェネリック型を使用するようにコンパイラーにヒントを与える方法はありますか?

  13. 13

    オブジェクトの破棄でネストされたデフォルトパラメータを処理する方法は?

  14. 14

    ジェネリック型としてのデフォルトパラメータ

  15. 15

    Springを使用しているときに、チェックスタイルメッセージ「ユーティリティクラスにデフォルトのパブリックコンストラクターを含めることはできません」を抑制する方法

  16. 16

    タイプのデフォルトのジェネリックデリゲートを取得する方法

  17. 17

    SpringBootリクエストパラメータで使用されるクラスのフィールド値にデフォルト値を設定する方法

  18. 18

    ジェネリックにデフォルト値を割り当てる

  19. 19

    Swift関数のオプションのジェネリックパラメーターのデフォルト値

  20. 20

    フィールドのジェネリックパラメータのクラスを取得する方法

  21. 21

    デフォルトパラメータを使用したジェネリックケースクラスのCirceエンコーダ

  22. 22

    ジェネリック型パラメーターのデータ型を抽出する方法は?

  23. 23

    Gsonシリアル化:ジェネリッククラスとジェネリックデータをその中にキャストする方法は?

  24. 24

    共通のcreateValueメソッドを定義するパラメーターを持つケースクラスのシェイプレスのジェネリックデフォルトインスタンスを使用してビルドします

  25. 25

    ジェネリックではないジェネリックパラメータを実装する方法

  26. 26

    PowerShellにスクリプトパラメーターのデフォルト値を取得する方法はありますか?

  27. 27

    ジェネリックパラメーターの「デフォルト引数」をシミュレートできますか?

  28. 28

    F#ジェネリックジェネリックコンストラクトでは、タイプ 'struct(Guid * int)'にパブリックデフォルトコンストラクターが必要です。

  29. 29

    デフォルトの引数でラムダを取るジェネリック関数を書く方法は?

ホットタグ

アーカイブ