You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:45:04