代码之家  ›  专栏  ›  技术社区  ›  Justin Grant

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

  •  0
  • Justin Grant  · 技术社区  · 6 年前

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

    我已经创建了一对泛型TypeScript帮助函数来进行序列化和反序列化。但我不知道如何使这些函数类型安全。我也不想处理维护普通类型和序列化类型对的问题——相反,我只想定义“普通”类型并使用泛型类型定义来定义序列化类型。

    具体来说,给定某种类型 T 可能有 日期 -类型化属性(在顶层或嵌套对象中)我要为其创建类型定义 Serialized<T> 它的形状和 T 除了这一切 日期 -类型化属性替换为 string . 这可能吗?

    interface OriginalType {
      foo: Date, 
      bar: number, 
      nested: { 
        created: Date 
      } 
    }
    

    我希望最终得到如下类型:(但不需要手动键入定义)

    interface SerializedType {
      foo: string, 
      bar: number, 
      nested: { 
        created: string
      } 
    }
    

    申报的目的是什么 ?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Matt McCutchen    6 年前

    你在寻找一个递归同态 mapped type (遍历字段)使用 conditional type (检查每个字段是否为日期)。

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

    Serialized 对基元类型返回基元类型,而不管同态映射类型的主体是什么。