3

(編集私は monocle-ts を使用してますが、 monocle-ts では不可能な場合 (著者は、元の Monocle for Scala の部分的な移植にすぎないとさえ言っているため)、任意の言語の別の光学パッケージに何かがある場合は、私は、これらのアイデアを TypeScript に移植することにオープンです。)

Partial<A>typeの一部またはすべてを持ち、非メンバーを持たないレコードを表すようなヘルパー型があるとしAます。A = { foo: number, bar: string }(その場合Partial<A> = { foo?: number, bar?: string }) (編集これは Typescript の組み込みの Partial ユーティリティ タイプです。)

私はから始めます

interface Parent {
  xs: Child[]
}

interface PartialParent {
  partialxs: Partial<Child>[]
}

declare function fillInTheGaps(x: Partial<Child>):Child

レンズを合成し、トラバーサルを合成 ( ) して、レンズからcomposedTraversal焦点を合わせ 、配列として走査するとします。これは.partialxsPartialStateTraversal<PartialState, Partial<Child>>

また、すべての に適用された新しいを生成するすべての子にdeclare const fn = (x:Partial<Child>):Partial<Child>適用できるを持っていることも確認してください。fncomposedTraversal.modify(fn)(partialState)PartialStatefnpartialxs

このトラバーサルを別のものに「拡大」または「変換」して、レンズとトラバーサルを構成して使用できるfillInTheGapsようにする概念はPartialStateありますStateか?

私の構文が TypeScript であることを無視して、monocle-scala タグを追加しました。この概念が存在する場合、それは Monocle ライブラリにあり、その知識を使用しているライブラリに変換できるからです。

編集この質問の動機となる問題は、ユーザーがデータを入力するReduxアプリにフォーム入力があることですが、ほとんどは必要ありません。入力はコンパイル時に認識されない (RESTful API クエリから再試行される) ため、モデルを次のように表すことはできません。

interface Model {
  foo?: string[]
  bar?: string[]
}

代わりに、次のように表されます。

interface Model {
  [index:string]: string[]
}

RESTful サーバーからデフォルト モデルを取得することもできます。そこで、これらをParent(サーバーから来るもの) とPartial<Parent>(アプリでのユーザーの入力を表すもの) としてモデル化しました。

いくつかの計算を行う前に、不足している小道具のデフォルトを折りたたむ必要があります。これは、fillInTheGaps上記で参照した私の関数です。

コード内の型を介してこれが行うことを強制し、既に多くのオプティクスを記述しているため、その一部を再利用したいと考えていました。私は実際に、このデータに対して他の操作を実行するためにレンズとトラバーサルを作成しました。myLens.compose(myTraversal).modify(fn)を取り、 aPartial<State>を返しますが、Partial<State>これらを構成して、部分的なものを取り、全体を返す関数になることを望んでいました。

明らかに、書いconst filler: (Partial<State>):State = myLens.compose(myTraversal).modify(fillInTheGaps)てからその上に a を投げれ//@ts-ignoreば、それが機能することを知ることができますが、それは、ええと、壊れやすいようです。

4

1 に答える 1