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