我正在尝试为具有可选属性的对象创建Eq
。到目前为止,我已经尝试了以下操作:
type Thing = { a: string; b?: string };
const eqThing = Eq.struct<Thing>({
a: S.Eq,
b: S.Eq // Type 'Eq<string>' is not assignable to type 'Eq<string | undefined>'.
});
eqThing.equals({ a: "a", b: "b" }, { a: "a" }); // false
我认为一定有一种方法来指定b
是Eq<string | undefined>
,但我不确定如何。
这可以通过使用Eq.eqStrict
来实现。
type Thing = { a: string; b?: string };
const partialStruct = Eq.struct<Thing>({
a: S.Eq,
b: Eq.eqStrict
});
expect(partialStruct.equals({ a: "a", b: "b" }, { a: "a" })).toBe(false);
expect(partialStruct.equals({ a: "a", b: "b" }, { a: "a", b: "b" })).toBe(true);
我也遇到过这种情况。我的解决方案是创建一个辅助函数:
export const getOptionalEq = <A>(eqElement: Eq<A>): Eq<A | undefined> =>
fromEquals((x, y) =>
x === undefined || y === undefined ? x === y : eqElement.equals(x, y)
);
可以这样使用:
type Thing = { a: string; b?: string };
const eqThing = Eq.struct<Thing>({
a: S.Eq,
b: getOptionalEq(S.Eq)
});