如何使用映射类型映射嵌套泛型类型中的属性子集

How to use mapped types to map a subset of properties in a nested generic type

我有这样的类型:

type Thing = {
  name: string;
  deliveryDate: string;
  stuff: {
    place: string;
    datedContacted: string;
  }
}

我想创建一个具有相同结构的映射类型,如下所示:

type FormThing = {
  name: string;
  deliveryDate: Moment;
  stuff: {
    place: string;
    datedContacted: Moment;
  }
}

我在这里查看 TypeScript 的“映射类型”:https://www.typescriptlang.org/docs/handbook/2/mapped-types.html,但他们的示例似乎主要讨论如何将一个类型的所有属性转换为另一个类型,而不是子集。

我试过像这样创建一个通用类型:

type DateFields = {
  deliveryDate: string;
  dateContacted: string;
}

export type Form<T> = T & {
  [Property in keyof DateFields]: Moment;
};

但它似乎没有按预期工作。理想情况下,我将其设为通用,这样我就可以创建一个类型化方法,该方法可以独立处理此嵌套对象的任何子级别的转换,从 TForm<T>.

您可以通过首先将 DateFields 更改为字符串文字的并集,然后创建递归映射类型来实现此深度映射类型

type Thing = {
    name: string;
    deliveryDate: string;
    stuff: {
        place: string;
        dateContacted: string;
    }
}

type DateFields = 'deliveryDate' | 'dateContacted';


type Form<T, Fields> = {
    [K in keyof T]: K extends Fields ? Moment : T[K] extends object ? Form<T[K], Fields> : T[K];
}

this TypeScript playground

中检查它