如何用io-ts字面量联合定义对象的必填与可选键?
解决io-ts中部分键可选的编解码器定义问题
你当前用iots.record生成的编解码器会把所有SupportedEnv中的键都设为必填,这是因为record的语义是所有符合键类型的键必须全部存在,所以没法直接通过record实现部分可选的结构,得换个思路拆分构造:
具体实现代码
import * as iots from 'io-ts'; const GeneralCodec = iots.unknown; // 先分别构造必填和可选的对象编解码器 const RequiredPart = iots.type({ required: GeneralCodec }); const OptionalPart = iots.partial({ optional: GeneralCodec }); // 通过交叉类型组合两者,得到最终的编解码器 const SupportedCodec = iots.intersection([RequiredPart, OptionalPart]); // 推导出来的类型完全符合预期 type Supported = iots.TypeOf<typeof SupportedCodec>;
为什么这个方案可行?
iots.type用于定义所有键都必填的对象结构iots.partial用于定义所有键都可选的对象结构- 两者通过
iots.intersection交叉后,就得到了required必填、optional可选的复合结构,完全匹配你想要的类型。
如果后续SupportedEnv需要扩展新的键,只需要把新的必填键加到RequiredPart,可选键加到OptionalPart即可,灵活性很高。
内容的提问来源于stack exchange,提问作者StephenWeiss
相关产品推荐
相关产品推荐

