将所有Date属性(包括嵌套的)转换为TypeScript通用类型的字符串

时间:2018-10-20 20:56:24

标签: typescript amazon-dynamodb

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>的声明应该是什么?

1 个答案:

答案 0 :(得分:1)

您正在使用mapped type(用于检查每个字段是否为日期)来寻找递归同形conditional type(用于遍历字段)。

type Serialized<T> = {
    [P in keyof T]: T[P] extends Date ? string : Serialized<T[P]>
};

此解决方案利用了特殊规则,即将Serialized之类的同态映射类型应用于原始类型将返回原始类型,而不管同态映射类型的主体如何。