#typescript #monocle #haskell-optics #monocle-ts
Вопрос:
Есть ли способ в monocle (особенно в monocle-ts) изменить политику обработки отсутствующих вставленных узлов в структурированных данных, таких как в примерах A, B и C ниже, чтобы создавать их вместо того, чтобы не работать? У меня есть пример использования, в котором желательно другое поведение. Могу ли я работать в библиотеке, чтобы достичь этого?
import { Optional } from "monocle-ts";
interface BazMaybe {
baz?: number;
}
interface BarMaybe {
bar?: BazMaybe;
}
interface FooMaybe {
foo?: BarMaybe;
}
const baz = Optional.fromNullableProp<BazMaybe>()("baz");
const bar = Optional.fromNullableProp<BarMaybe>()("bar");
const foo = Optional.fromNullableProp<FooMaybe>()("foo");
const foo_bar_baz = foo.compose(bar).compose(baz);
// A) no op, gives `{}`
console.log(JSON.stringify(foo_bar_baz.set(42)({})));
// B) no op, gives `{"foo":{"bar":{}}}`
console.log(JSON.stringify(foo_bar_baz.set(42)({ foo: { bar: {} } })));
// C) no op, gives `{"foo":{"bar":{}}}`
console.log(JSON.stringify(foo_bar_baz.set(42)({ foo: { bar: { baz: undefined } } })));
// D) ok, finally, gives `{"foo":{"bar":{"baz":42}}}`
console.log(JSON.stringify(foo_bar_baz.set(42)({ foo: { bar: { baz: 0 } } }));
Кроме того, можем ли мы определить политику, чтобы всегда заменять пустые файлы во время обновлений на неопределенные (рекурсивно), чтобы обратная операция была согласованной?
// E) ideally, this should give `{}`
console.log(JSON.stringify(foo.compose(bar).modify(
( baz, ...rest ) =>
(rest))({ foo: { bar: { baz: 42} } })));