AWS DynamoDB不存储Date
值,因此在存储之前,所有日期/时间值都需要序列化为ISO 8601字符串,然后在检索时需要从字符串反序列化为Date
。
我创建了一对通用的TypeScript帮助器函数来进行序列化和反序列化。但是我不确定如何使这些函数类型安全。我也不想处理维护成对的普通类型和序列化类型,而是只想定义“普通”类型,并使用通用类型定义来定义序列化类型。
具体来说,给定某种类型的T
,它可能具有Date
类型的属性(在顶层或嵌套对象中),我想为Serialized<T>
创建一个类型定义,形状与T
相同,只是所有Date
类型的属性都被string
代替。这可能吗?
例如,给定一个看起来像这样的对象:
interface OriginalType {
foo: Date,
bar: number,
nested: {
created: Date
}
}
我希望得到的类型类似于以下类型:(但无需手动输入定义)
interface SerializedType {
foo: string,
bar: number,
nested: {
created: string
}
}
Serialized<T>
的声明应该是什么?
答案 0 :(得分:1)
您正在使用mapped type(用于检查每个字段是否为日期)来寻找递归同形conditional type(用于遍历字段)。
type Serialized<T> = {
[P in keyof T]: T[P] extends Date ? string : Serialized<T[P]>
};
此解决方案利用了特殊规则,即将Serialized
之类的同态映射类型应用于原始类型将返回原始类型,而不管同态映射类型的主体如何。