首页 > 解决方案 > 更改 io-ts Codec.struct 中一个属性的编解码器

问题描述

我有一些对象要更改一个属性的编解码器。例如,我有一个带有日期字段的结构。根据第 3 个系统 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
});


标签: typescriptfp-ts

解决方案


不,这是不可能的。实现此目的的推荐方法如下:

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


推荐阅读