Измените кодек одного свойства в io-ts Codec.struct

#typescript #fp-ts

Вопрос:

У меня есть несколько объектов, в которых я хочу изменить кодек одного свойства. Например, у меня есть структура с полем даты. В зависимости от API 3-й системы иногда входное значение отображается в виде метки времени, иногда в виде строки 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
});


 

Ответ №1:

Нет, это невозможно. Рекомендуемый способ достижения этой цели заключается в следующем:

 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 } amp; { ...someDate... } amp; ... зависеть от того, сколько вещей я объединил.