io-ts:将 TypeOf 与 DateFromISOString 一起使用

io-ts : use TypeOf with DateFromISOString

正在尝试验证和解码 api 响应:

const Foo  = t.type({
    id: t.number,
    date: DateFromISOString,
  });

  type FooType = t.TypeOf<typeof Foo>;
  const jsonFoo: FooType = {"id": 1, date: "2021-02-05T11:13:22.520Z"};
  const resultFoo = Foo.decode(jsonFoo);

问题是类型将 data 属性 描述为日期,而它在 jsonFoo

中是字符串

我是不是遗漏了什么,或者我需要两种类型的输入数据和解码对象?

您可以简单地使用 'union' 函数并合并 DateFromISOString 和字符串类型。

const Foo = t.type({
      id: t.number,
      date: t.union([DateFromISOString, t.string]),
    });

我找到的另一个解决方案是:

从字符串构建 Date 实例,然后使用 'toISOString' 辅助函数再次将其传递给字符串。

const Foo = type({
      id: number,
      date: DateFromISOString,
    });

type FooType = TypeOf<typeof Foo>;
const jsonFoo: FooType = { id: 1, date: new Date("2021-02-05T11:13:22.520Z") };
const resultFoo = Foo.decode(jsonFoo);

const input = jsonFoo.date.toISOString();

assert.deepStrictEqual(input, right(jsonFoo.date)); // fails
assert.deepStrictEqual(DateFromISOString.decode(input), right(jsonFoo.date)); // success