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

Jus*_*ant 4 amazon-dynamodb typescript

AWS DynamoDB 不存储Date值,因此所有日期/时间值在存储之前都需要序列化为 ISO 8601 字符串,然后在Date检索时需要从字符串反序列化。

我创建了一对通用 TypeScript 辅助函数来执行序列化和反序列化。但我不确定如何使这些函数类型安全。我也不想处理维护正常类型与序列化类型对的问题 - 相反,我只想定义“正常”类型并使用泛型类型定义来定义序列化类型。

具体来说,给定某些T可能具有Date类型属性的类型(无论是在顶层还是在嵌套对象中),我想为其创建一个Serialized<T>具有相同形状的类型定义,T只是所有Date类型属性都替换为string. 这可能吗?

例如,给定一个如下所示的对象:

interface OriginalType {
  foo: Date, 
  bar: number, 
  nested: { 
    created: Date 
  } 
}
Run Code Online (Sandbox Code Playgroud)

我想最终得到如下所示的类型:(但无需手动输入定义)

interface SerializedType {
  foo: string, 
  bar: number, 
  nested: { 
    created: string
  } 
}
Run Code Online (Sandbox Code Playgroud)

应该做什么声明Serialized<T>

Mat*_*hen 7

您正在寻找使用条件类型(以检查每个字段是否为日期)的递归同态映射类型(以迭代字段)。

type Serialized<T> = {
    [P in keyof T]: T[P] extends Date ? string : Serialized<T[P]>
};
Run Code Online (Sandbox Code Playgroud)

该解决方案利用了特殊规则,即应用同态映射类型(例如,Serialized应用于基本类型)会返回基本类型,而不管同态映射类型的主体如何。