TypeScript中如何动态提取泛型下类型为Date的对象属性键
实现方案说明
结论
这个需求在TypeScript中可以实现,需要结合编译期类型约束和运行时逻辑两部分处理。因为TypeScript的类型信息会在编译后完全擦除,无法直接在运行时获取泛型的属性类型信息,因此需要额外补充少量运行时的判断依据。
第一步:定义类型提取工具
首先通过TypeScript的条件类型+映射类型,实现提取泛型T中所有属性类型为Date的键的工具类型:
// 工具类型:提取T中所有属性类型为Date的键 type DateKeys<T> = { [K in keyof T]: T[K] extends Date ? K : never }[keyof T]
用示例中的MyType测试的话,DateKeys<MyType>的计算结果就是联合类型'firstDate' | 'secondDate',完全符合筛选要求。
第二步:实现方法逻辑
因为运行时拿不到泛型T的类型信息,我们需要预先把对应类型的Date键列表作为运行时判断依据传入,方法实现如下:
function myMethod<T>(obj: Record<string, any>, dateKeys: DateKeys<T>[]): DateKeys<T>[] { // 筛选出入参obj中存在、且属于T的Date类型属性的键 return Object.keys(obj).filter(key => dateKeys.includes(key as DateKeys<T>)) as DateKeys<T>[] }
第三步:使用示例
按照场景使用方式如下:
// 预先定义MyType对应的Date键列表,有了DateKeys的类型约束,写错键会直接报类型错误 const MyTypeDateKeys: DateKeys<MyType>[] = ['firstDate', 'secondDate'] const result1 = myMethod<MyType>(myObj1, MyTypeDateKeys); // 输出:['firstDate'] const result2 = myMethod<MyType>(myObj2, MyTypeDateKeys); // 输出:['secondDate'] const result3 = myMethod<MyType>(myObj3, MyTypeDateKeys); // 输出:['firstDate', 'secondDate']
执行结果和期望完全一致,同时返回的数组元素会自动带上准确的类型提示,不会丢失类型信息。
补充说明
如果不想手动维护每个类型的Date键列表,可以基于TypeScript Compiler API做工程化扩展,在编译阶段自动生成对应类型的Date键列表,适合业务中大量用到该能力的场景。
内容的提问来源于stack exchange,提问作者Raffaele
相关产品推荐
相关产品推荐

