TypeScriptのパラメーターに基づいて、辞書で関数の戻り値の型を定義します

なやろ

関数パラメータに応じて異なるオブジェクトを返す関数があります。Typescriptでこれを達成する方法はありますか?

これは私がどこまで得たかです:

type returnMap = {
    'a': number,
    'b': string[]
}

function func<T extends returnMap, K extends keyof T>(val: K): T[K] {
    if (val == 'a') {return 5}
    if (val == 'b') {return ['a', 'b']}
    return 42
}
console.log(func('a'))  // 5

ただし、戻り値には「TS2322:タイプ「5」はタイプ「T [K]」に割り当てられません」と記載されています。

前もって感謝します

Tomasz Gawel

これは行います:

interface ReturnMap {
  'a': number;
  'b': string[];
}

function func<K extends keyof ReturnMap>(val: K): ReturnMap[K];
function func(val: keyof ReturnMap): ReturnMap[keyof ReturnMap] {
  if (val === 'a') return 5;
  if (val === 'b') return ['a', 'b'];
  throw new Error();
}

const r1 = func('a'); // const r1: number
const r2 = func('b'); // const r2: string[]

// Argument of type '"c"' is not assignable to parameter of type '"a" | "b"'.ts(2345)
const r3 = func('c'); // const r3: number | string[]

関数のオーバーロード構文に注意してください。

function func<K extends keyof ReturnMap>(val: K): ReturnMap[K];
function func(val: keyof ReturnMap): ReturnMap[keyof ReturnMap] { // ...

2番目の署名のみを使用した場合、返されるタイプは常にnumber | string[]です。

最初の署名のみを使用した場合、それReturnMap[K]number & string[]排他的であると評価されるため、上記の質問で説明したエラーが発生します。

ちなみに、バグのある振る舞いのようReturnMap[K]評価されましたnumber & string[]

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

TypeScriptのパラメーターに基づいて戻り値の型を動的に生成します

分類Dev

関数のパラメーター値に基づいて、C ++で関数の戻り値の型を動的に変更する方法はありますか?

分類Dev

パラメータのプロパティに基づいて関数の戻り値の型を適用します

分類Dev

typescriptのパラメータ値に基づいて条件付きで関数を入力します

分類Dev

パラメータ化された型に基づいて、関数に引数と戻り値の型の制限を強制する

分類Dev

関数の書き方は、ユーザー定義のデータ型に基づいて整数またはブール値を返しますか?

分類Dev

TypeScript:関数の引数の型に基づいて関数の戻り値の型を設定する方法

分類Dev

オプションのパラメーターに基づいて戻り値の型を指定する

分類Dev

typeofパラメータ値に基づいて戻り値の型

分類Dev

クラスでプライベート構造を定義するとき、それを関数パラメーターまたは戻り値の型としてどのように使用しますか?

分類Dev

型パラメーターのtype引数に基づいてポリモーフィックな戻り値の型を持つ関数を作成するにはどうすればよいですか?

分類Dev

カスタム関数に基づいて、キーごとに辞書の値をマージします

分類Dev

Swiftで別のパラメーターなしの関数を含む関数の戻り値の型を定義するにはどうすればよいですか?

分類Dev

オプションの関数パラメーターに基づくさまざまな戻り値の型-Typescript

分類Dev

TypeScriptのパラメータ値に応じて戻り値の型を変更します

分類Dev

提供されたパラメーターを使用して、関数の戻り値の型をどのように推測できますか?

分類Dev

任意の種類のパラメータと既知の戻り型で関数を定義する

分類Dev

連続変数の開始/初期値に基づいてパラメータを設定します

分類Dev

オプションのパラメータに基づく関数の戻り値の型

分類Dev

タイプガードに基づいて関数の戻り値の型を推測する

分類Dev

2 番目のパラメーターに基づいた一意の値で Python で新しい辞書を作成します。

分類Dev

テンプレート化されたパラメーターとして指定された関数の戻り値の型を決定します

分類Dev

戻り値の型の不完全な型と宣言されているが定義されていない関数のパラメーター

分類Dev

typescriptは、パラメーター値に基づいて関数の応答タイプを推測できますか?

分類Dev

インターフェイスのキー/値を使用して関数の戻り値の型を定義しようとしています

分類Dev

最初のパラメーターと同じ戻り型を持つ関数を定義する正しい方法は何ですか

分類Dev

最初のパラメーターと同じ戻り型を持つ関数を定義する正しい方法は何ですか

分類Dev

Swift:サブクラスの戻り値の型を持つ関数をプロトコルに準拠させるにはどうすればよいですか?スーパークラスは戻り値の型として定義されていますか?

分類Dev

TypeScript関数は、入力パラメーターに基づいて型を返します

Related 関連記事

  1. 1

    TypeScriptのパラメーターに基づいて戻り値の型を動的に生成します

  2. 2

    関数のパラメーター値に基づいて、C ++で関数の戻り値の型を動的に変更する方法はありますか?

  3. 3

    パラメータのプロパティに基づいて関数の戻り値の型を適用します

  4. 4

    typescriptのパラメータ値に基づいて条件付きで関数を入力します

  5. 5

    パラメータ化された型に基づいて、関数に引数と戻り値の型の制限を強制する

  6. 6

    関数の書き方は、ユーザー定義のデータ型に基づいて整数またはブール値を返しますか?

  7. 7

    TypeScript:関数の引数の型に基づいて関数の戻り値の型を設定する方法

  8. 8

    オプションのパラメーターに基づいて戻り値の型を指定する

  9. 9

    typeofパラメータ値に基づいて戻り値の型

  10. 10

    クラスでプライベート構造を定義するとき、それを関数パラメーターまたは戻り値の型としてどのように使用しますか?

  11. 11

    型パラメーターのtype引数に基づいてポリモーフィックな戻り値の型を持つ関数を作成するにはどうすればよいですか?

  12. 12

    カスタム関数に基づいて、キーごとに辞書の値をマージします

  13. 13

    Swiftで別のパラメーターなしの関数を含む関数の戻り値の型を定義するにはどうすればよいですか?

  14. 14

    オプションの関数パラメーターに基づくさまざまな戻り値の型-Typescript

  15. 15

    TypeScriptのパラメータ値に応じて戻り値の型を変更します

  16. 16

    提供されたパラメーターを使用して、関数の戻り値の型をどのように推測できますか?

  17. 17

    任意の種類のパラメータと既知の戻り型で関数を定義する

  18. 18

    連続変数の開始/初期値に基づいてパラメータを設定します

  19. 19

    オプションのパラメータに基づく関数の戻り値の型

  20. 20

    タイプガードに基づいて関数の戻り値の型を推測する

  21. 21

    2 番目のパラメーターに基づいた一意の値で Python で新しい辞書を作成します。

  22. 22

    テンプレート化されたパラメーターとして指定された関数の戻り値の型を決定します

  23. 23

    戻り値の型の不完全な型と宣言されているが定義されていない関数のパラメーター

  24. 24

    typescriptは、パラメーター値に基づいて関数の応答タイプを推測できますか?

  25. 25

    インターフェイスのキー/値を使用して関数の戻り値の型を定義しようとしています

  26. 26

    最初のパラメーターと同じ戻り型を持つ関数を定義する正しい方法は何ですか

  27. 27

    最初のパラメーターと同じ戻り型を持つ関数を定義する正しい方法は何ですか

  28. 28

    Swift:サブクラスの戻り値の型を持つ関数をプロトコルに準拠させるにはどうすればよいですか?スーパークラスは戻り値の型として定義されていますか?

  29. 29

    TypeScript関数は、入力パラメーターに基づいて型を返します

ホットタグ

アーカイブ