首页 > 解决方案 > 如何使用映射类型来映射嵌套泛型类型中的属性子集

问题描述

我有这样的类型:

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 ,但他们的示例似乎主要涉及如何转换 a 的所有属性键入另一个,而不是子集。

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

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

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

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

标签: typescriptmapped-types

解决方案


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];
}

在这个 TypeScript 游乐场中检查它


推荐阅读