TL;DR

  • そもそも DTO に変換する必要があるジェネリクスはほとんどない。
  • シリアライズライブラリがジェネリクスに対応していればジェネリックな DTO を作り、対応していなければケースごとに具象型の DTO を作る。

内容

ドメイン型を DTO に変換する方法の 1 つである。前提として、DTO に変換する必要があるジェネリクスはほとんど存在しない。

シリアライズライブラリがジェネリクスに対応している場合は、ジェネリックな DTO を作れる。たとえば Result は次のように書ける。when 'OkData: null and 'ErrorData: null で、それぞれの型が null を取れるようにしている。

type ResultDto<'OkData, 'ErrorData when 'OkData: null and 'ErrorData: null> =
    { IsError: bool
      OkData: 'OkData
      ErrorData: 'ErrorData }

対応していない場合は、具体的なケースごとに具象型を別に作る必要がある。たとえば、受注確定ワークフローの戻り値の型 Result<PlaceOrderEvent list, PlaceOrderError>(実際のパイプラインでの bind と map の利用)は次のようになる。

type PlaceOrderResultDto =
    { IsError: bool
      OkData: PlaceOrderEventDto[]
      ErrorData: PlaceOrderErrorDto }

キーワード