タイプを使用して特定のパラメーターのペアを適用するにはどうすればよいですか?

バグ

さまざまな種類のグラフの生成を担当するサービスがあります。

生成できるグラフのスペースには2つの次元がchartTypeありdataType、は両方とも有限の値のセットであり、次のようになります。

enum ChartType {
  ChartTypeA,
  ChartTypeB,
  ChartTypeC
}

enum DataType {
  DataTypeA,
  DataTypeB,
  DataTypeC
}

このサービスは、単一のパブリックメソッドを公開しgenerateChart(chartType: ChartType , dataType: DataType)ます。このメソッドchartTypeは、渡される内容に応じて、関連するプライベートメソッドを呼び出します

プライベートメソッドの正確な実装は、他のパラメータに依存しますdataType

ここまでは順調ですね。

私の問題は次のとおりです。いくつかの組み合わせは(ChartType, DataType)不可能です(つまりChartTypeAとでグラフを生成できませんDataTypeC)。これにより、現在の実装に疑問が生じます。

可能なパラメーターのペアのみが関数に渡されるようにコンパイラーが強制できるように、データを整理するためのより良い方法は何ですか?

Titian Cernicova-Dragomir

可能な有効な組み合わせごとにオーバーロードを使用できます。

enum ChartType {
    ChartTypeA,
    ChartTypeB,
    ChartTypeC
}

enum DataType {
    DataTypeA,
    DataTypeB,
    DataTypeC
}

function generateChart(chartType: ChartType.ChartTypeA, dataType: DataType.DataTypeA)
function generateChart(chartType: ChartType.ChartTypeC, dataType: DataType.DataTypeC)
function generateChart(chartType: ChartType.ChartTypeB, dataType: DataType.DataTypeB)
function generateChart(chartType: ChartType, dataType: DataType) { // Implementation signature

}

generateChart(ChartType.ChartTypeA, DataType.DataTypeA)
generateChart(ChartType.ChartTypeA, DataType.DataTypeC) // Error

または、マッピングタイプを使用して、式を少し減らすことができます。

interface EnuMap  {
    [ChartType.ChartTypeA]: DataType.DataTypeA,
    [ChartType.ChartTypeB]: DataType.DataTypeB,
    [ChartType.ChartTypeC]: DataType.DataTypeC,
}

function generateChart<T extends ChartType>(chartType: T, dataType: EnuMap[T])
function generateChart(chartType: ChartType, dataType: DataType) { // Implementation signature

}

generateChart(ChartType.ChartTypeA, DataType.DataTypeA)
generateChart(ChartType.ChartTypeA, DataType.DataTypeC) // Error

マッピングタイプにインターフェイスを使用する場合、プラグインがタイプの新しい組み合わせをサポートしている場合など、必要に応じてインターフェイスを拡張できます。

編集

ほとんどの組み合わせが可能であり、少数のみを除外する必要がある場合は、別のアプローチを使用できます。最初に、パラメーターのすべての可能な組み合わせとExclude、不可能な組み合わせを取り除くための使用含むタイプを作成します

function generateChart<T extends Excluded>(...a: T)
function generateChart(chartType: ChartType, dataType: DataType) { // Implementation signature

}
type AllCombinations = {
    [C in ChartType]: {
        [D in DataType]: [C, D]
    }
}[ChartType][DataType]
// Exclude unwanted combinations
type Excluded = Exclude<AllCombinations, [ChartType.ChartTypeA, DataType.DataTypeC]>; 

generateChart(ChartType.ChartTypeA, DataType.DataTypeA)
generateChart(ChartType.ChartTypeB, DataType.DataTypeA)
generateChart(ChartType.ChartTypeA, DataType.DataTypeC) // Error

このアプローチでは、パラメーター名の表現力が少し失われ、コンパイラーが提案するオーバーロードが発生します(コード補完だけで、期待どおりに機能します)

インテリセンスでより適切に機能し、パラメーター名を保持するソリューションはUnionToIntersectionここから使用構築できます最初にすべての可能なシグニチャの和集合を作成し、次にUnionToIntersectionすべてのオーバーロードを含む関数を作成するために使用します。

type AllCombinations = {
    [C in ChartType]: {
        [D in DataType]: [C, D]
    }
}[ChartType][DataType]
type Excluded = Exclude<AllCombinations, [ChartType.ChartTypeA, DataType.DataTypeC]>;
type UnionToIntersection<U> = 
    (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never

type SignatureHelper<T> = T extends [infer C, infer D] ? (chartType: C, dataType: D) => void : never;
type GenerateChartType = UnionToIntersection<SignatureHelper<Excluded>>
const generateChart:GenerateChartType  = (chartType: ChartType, dataType: DataType) => { // Implementation signature

}
generateChart(ChartType.ChartTypeA, DataType.DataTypeA)
generateChart(ChartType.ChartTypeB, DataType.DataTypeA)
generateChart(ChartType.ChartTypeA, DataType.DataTypeC) // Error

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

`cellfun`(MATLAB)を使用して複数のパラメーターを持つ関数を適用するにはどうすればよいですか?

分類Dev

Haskellで、制約をパラメトリックニュータイプにアタッチして、それを使用するすべてのクラスインスタンスに自動的に適用されるようにするにはどうすればよいですか?

分類Dev

タイプパラメータを使用してタプル内のタイプを処理するにはどうすればよいですか?

分類Dev

タイプヒントを使用して、パラメーターに複数のタイプを指定するにはどうすればよいですか?

分類Dev

Racket / Plaitのパラメーターとして特定のタイプの関数を指定するにはどうすればよいですか?

分類Dev

LESSでループを使用して、タイポグラフィ用の特定のクラス名を作成するにはどうすればよいですか?

分類Dev

`sep`パラメータを渡して、separate_rows()をすべての列に適用するにはどうすればよいですか?

分類Dev

テンプレートを使用してstd :: functionのパラメータータイプを推測するにはどうすればよいですか?

分類Dev

デバイスのすべてのアプリにパターンロックを適用するにはどうすればよいですか?

分類Dev

Elixirのパイプ演算子を介して渡されたパラメーターにアクセスするにはどうすればよいですか?

分類Dev

パラメータとして渡された関数のパラメータタイプを検出するにはどうすればよいですか?

分類Dev

ジェネリックをパラメーターとして使用して、後で特定のメソッドを適用する関数を受け取るにはどうすればよいですか?

分類Dev

静的Webページのパラメーターを使用してわかりやすいURLを処理するにはどうすればよいですか?

分類Dev

複数のパラメーターを渡して使用するにはどうすればよいですか?

分類Dev

javascriptのみを使用して別のページにリンクパラメータの詳細を表示するにはどうすればよいですか?

分類Dev

hibernateを使用してMysqlストアプロシージャの出力パラメータを取得するにはどうすればよいですか?

分類Dev

Sklearnのパイプラインを使用してパラメーターの調整/相互検証を行うにはどうすればよいですか?

分類Dev

複数のパラメータを使用してPythonPrintを適切にフォーマットするにはどうすればよいですか?

分類Dev

トランジションのイージングに個々のパラメータを適用するにはどうすればよいですか?

分類Dev

Windowsでパラメータを使用してgitcommitのコマンドエイリアスを設定するにはどうすればよいですか?

分類Dev

関数名のパラメータータイプを回避するにはどうすればよいですか?

分類Dev

Jinjaフィルターを使用してアイテムのリストに辞書を適用するにはどうすればよいですか?

分類Dev

「routeprint」の出力を使用して特定のネットワークカードパラメータを設定するにはどうすればよいですか?

分類Dev

パラメータを使用してディスプレイまたは同様の方法を作成するにはどうすればよいですか?

分類Dev

オプションのパラメーターを使用してコンストラクターを作成するにはどうすればよいですか?

分類Dev

Rを使用してデータフレームの特定の列に関数を適用するにはどうすればよいですか?

分類Dev

Pythonモックモジュールを使用して、スタブしたいメソッドのみをスタブし、他のプロパティとメソッドをそのままにするようにクラスにパッチを適用するにはどうすればよいですか?

分類Dev

パラメータとして渡された特定のファイル以外のファイルを削除するにはどうすればよいですか?

分類Dev

クラスタイプパラメータを特定のタプルで制限するにはどうすればよいですか?(スカラ2.10.4)

Related 関連記事

  1. 1

    `cellfun`(MATLAB)を使用して複数のパラメーターを持つ関数を適用するにはどうすればよいですか?

  2. 2

    Haskellで、制約をパラメトリックニュータイプにアタッチして、それを使用するすべてのクラスインスタンスに自動的に適用されるようにするにはどうすればよいですか?

  3. 3

    タイプパラメータを使用してタプル内のタイプを処理するにはどうすればよいですか?

  4. 4

    タイプヒントを使用して、パラメーターに複数のタイプを指定するにはどうすればよいですか?

  5. 5

    Racket / Plaitのパラメーターとして特定のタイプの関数を指定するにはどうすればよいですか?

  6. 6

    LESSでループを使用して、タイポグラフィ用の特定のクラス名を作成するにはどうすればよいですか?

  7. 7

    `sep`パラメータを渡して、separate_rows()をすべての列に適用するにはどうすればよいですか?

  8. 8

    テンプレートを使用してstd :: functionのパラメータータイプを推測するにはどうすればよいですか?

  9. 9

    デバイスのすべてのアプリにパターンロックを適用するにはどうすればよいですか?

  10. 10

    Elixirのパイプ演算子を介して渡されたパラメーターにアクセスするにはどうすればよいですか?

  11. 11

    パラメータとして渡された関数のパラメータタイプを検出するにはどうすればよいですか?

  12. 12

    ジェネリックをパラメーターとして使用して、後で特定のメソッドを適用する関数を受け取るにはどうすればよいですか?

  13. 13

    静的Webページのパラメーターを使用してわかりやすいURLを処理するにはどうすればよいですか?

  14. 14

    複数のパラメーターを渡して使用するにはどうすればよいですか?

  15. 15

    javascriptのみを使用して別のページにリンクパラメータの詳細を表示するにはどうすればよいですか?

  16. 16

    hibernateを使用してMysqlストアプロシージャの出力パラメータを取得するにはどうすればよいですか?

  17. 17

    Sklearnのパイプラインを使用してパラメーターの調整/相互検証を行うにはどうすればよいですか?

  18. 18

    複数のパラメータを使用してPythonPrintを適切にフォーマットするにはどうすればよいですか?

  19. 19

    トランジションのイージングに個々のパラメータを適用するにはどうすればよいですか?

  20. 20

    Windowsでパラメータを使用してgitcommitのコマンドエイリアスを設定するにはどうすればよいですか?

  21. 21

    関数名のパラメータータイプを回避するにはどうすればよいですか?

  22. 22

    Jinjaフィルターを使用してアイテムのリストに辞書を適用するにはどうすればよいですか?

  23. 23

    「routeprint」の出力を使用して特定のネットワークカードパラメータを設定するにはどうすればよいですか?

  24. 24

    パラメータを使用してディスプレイまたは同様の方法を作成するにはどうすればよいですか?

  25. 25

    オプションのパラメーターを使用してコンストラクターを作成するにはどうすればよいですか?

  26. 26

    Rを使用してデータフレームの特定の列に関数を適用するにはどうすればよいですか?

  27. 27

    Pythonモックモジュールを使用して、スタブしたいメソッドのみをスタブし、他のプロパティとメソッドをそのままにするようにクラスにパッチを適用するにはどうすればよいですか?

  28. 28

    パラメータとして渡された特定のファイル以外のファイルを削除するにはどうすればよいですか?

  29. 29

    クラスタイプパラメータを特定のタプルで制限するにはどうすればよいですか?(スカラ2.10.4)

ホットタグ

アーカイブ