typescript - 如何使用映射类型来映射嵌套泛型类型中的属性子集
问题描述
我有这样的类型:
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>
。
解决方案
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];
}
推荐阅读
- android - 有没有办法修复无效的字段路径(``)。从 Android 应用程序访问 Firebase 时出现问题?
- php - PHP多选表单插入多个
- javascript - 有没有办法只在选中复选框的情况下传递复选框值?
- c# - 第一次在 C# 上使用 lambda 函数
- angularjs - 有没有办法将图表或带有仪表板的图表放在 AngularJS 项目中?
- java - 调用 startActivity() 时获得相同的屏幕
- excel - 是否可以读取 Excel 表并纯粹在前端显示其内容?
- jmeter - 如何从仪表板报告中保存图表(JMeter)
- c# - VSTO,更改word文档中所有图片的大小以适应页面宽度
- android - Fleetboard 上的 TLS 1.2