打字稿:将打字稿接口转换为表示 json.stringify 之后的类型

Typescript: Converting typescript interface to a type that represents what it would be after a json.stringify

假设我有一个简单的界面:

interface Calendar {
  dates: Date[]
  add: () => {}
}

如果一个日历对象得到Json.stringified,类型就变成这样:

interface StringifiedCalendar {
  dates: string[]
  // Function would dissappear
}

有没有一种简单的方法可以轻松地将原始界面转换为字符串化版本?我的用例是 rest API 会字符串化对象,我想在不重写的情况下重用后端的原始类型定义。

这至少是部分解决方案。 playground上的小编还是报了jcal有一个add属性,但是如果有人试图用它作为方法,就报错

interface Calendar {
  dates: Date[]
  add: () => {}
}

type Jsonized<T> = T extends object ? {
    [K in keyof T]: 
        T[K] extends Function ? never : 
        T[K] extends Date ? string :
        T[K] extends number ? number :
        T[K] extends string ? string :
        Jsonized<T[K]>
} : T;

declare let jcal: Jsonized<Calendar>;
jcal.add();

Playground