(編集私は 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
焦点を合わせ 、配列として走査するとします。これは.partialxs
PartialState
Traversal<PartialState, Partial<Child>>
また、すべての に適用された新しいを生成するすべての子にdeclare const fn = (x:Partial<Child>):Partial<Child>
適用できるを持っていることも確認してください。fn
composedTraversal.modify(fn)(partialState)
PartialState
fn
partialxs
このトラバーサルを別のものに「拡大」または「変換」して、レンズとトラバーサルを構成して使用できる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
ば、それが機能することを知ることができますが、それは、ええと、壊れやすいようです。