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
正在尝试验证和解码 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