Преобразовать все свойства Date (включая вложенные) в строку в универсальном типе TypeScript - PullRequest
0 голосов
/ 20 октября 2018

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 голосов
/ 21 октября 2018

Вы ищете рекурсивный гомоморфный сопоставленный тип (для перебора полей) с использованием условного типа (для проверки того, является ли каждое поле датой).

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

В этом решении используется специальное правило, согласно которому применение гомоморфного отображаемого типа, такого как Serialized, к примитивному типу возвращает примитивный тип независимо от тела гомоморфного отображаемого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...