在 io-ts Codec.struct 中更改一个 属性 的编解码器
Change codec of one property in io-ts Codec.struct
我有一些对象,我想更改其中一个 属性 的编解码器。 Fort 示例我有一个带有日期字段的结构。根据第三系统 api,有时输入值以时间戳的形式出现,有时以 ISO 字符串的形式出现。是否可以不重新声明其他所有内容?
import * as COD from "io-ts/Codec";
const TimestampDateCodec: COD.Codec<unknown, number, Date> = {};
const IsoStringDateCodec: COD.Codec<unknown, string, Date> = {};
const current = COD.struct({
id: COD.string,
// a lot of other props...
someDate: TimestampDateCodec, // change this to IsoStringDateCodec without redefining the whole struct
});
不,这是不可能的。推荐的实现方式如下:
const base = {
id: COD.string,
// a lot of other props...
}
const OneVersion = COD.struct({
...base,
someDate: TimestampDateCodec,
})
const AnotherVersion = COD.struct({
...base,
someDate: IsoStringDateCodec,
})
或者,
const base = COD.struct({
id: COD.string,
// a lot of other props...
})
const OneVersion = COD.union([base, COD.struct({
someDate: TimestampDateCodec,
})])
const AnotherVersion = COD.union([base, COD.struct({
someDate: IsoStringDateCodec,
})])
如果您喜欢从求和类型的角度思考,后者会很有吸引力,但我认为前者会在您的 IDE 中产生更易于阅读的类型。我经常做后者并后悔,因为我的 IDE 会告诉我一些时间的形式 { ...base } & { ...someDate... } & ...
取决于我合并了多少东西。
我有一些对象,我想更改其中一个 属性 的编解码器。 Fort 示例我有一个带有日期字段的结构。根据第三系统 api,有时输入值以时间戳的形式出现,有时以 ISO 字符串的形式出现。是否可以不重新声明其他所有内容?
import * as COD from "io-ts/Codec";
const TimestampDateCodec: COD.Codec<unknown, number, Date> = {};
const IsoStringDateCodec: COD.Codec<unknown, string, Date> = {};
const current = COD.struct({
id: COD.string,
// a lot of other props...
someDate: TimestampDateCodec, // change this to IsoStringDateCodec without redefining the whole struct
});
不,这是不可能的。推荐的实现方式如下:
const base = {
id: COD.string,
// a lot of other props...
}
const OneVersion = COD.struct({
...base,
someDate: TimestampDateCodec,
})
const AnotherVersion = COD.struct({
...base,
someDate: IsoStringDateCodec,
})
或者,
const base = COD.struct({
id: COD.string,
// a lot of other props...
})
const OneVersion = COD.union([base, COD.struct({
someDate: TimestampDateCodec,
})])
const AnotherVersion = COD.union([base, COD.struct({
someDate: IsoStringDateCodec,
})])
如果您喜欢从求和类型的角度思考,后者会很有吸引力,但我认为前者会在您的 IDE 中产生更易于阅读的类型。我经常做后者并后悔,因为我的 IDE 会告诉我一些时间的形式 { ...base } & { ...someDate... } & ...
取决于我合并了多少东西。