在 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... } & ... 取决于我合并了多少东西。