typescript - 更改 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
});
解决方案
不,这是不可能的。实现此目的的推荐方法如下:
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... } & ...
取决于我联合了多少东西。
推荐阅读
- c# - AD 调用超过 3269 查询非 ssl DC 服务器
- linux - 在 Cirrus/Kubernetes 环境中以特定的非 root 用户身份运行 Docker 容器
- java - 在创建和返回集合时管理内存
- azure - Kusto 查询语言:如何在数组中存储数百个对象
- jwt - 是否有可能一个应用程序不需要登录但仍受 api 保护
- python - 使用 Pytorch Conv2d 将多个过滤器应用于多个 CT 扫描中的每一层的最快方法是什么?
- shell - 使用 crontab 自动启动和停止服务的脚本
- python - 张量流值错误形状不兼容
- react-native - Expo AV React Native 本地声音文件问题
- javascript - 反应子组件不重新渲染映射状态