如何实现带修改键名的TypeScript泛型类型FilterFor
实现泛型类型
FilterFor<T> 先定义基础接口:
interface Foo { id: string; bar: string; } interface Person { name: string; age: number; birthdate: Date; active: boolean; foo: Foo; }
泛型实现代码
// 定义不同类型对应的扩展字段规则 type FilterExtensions<T, K extends string> = T extends string ? { [`${K}__in`]: T[]; [`${K}__search`]: T; } : T extends number | Date ? { [`${K}__gt`]: T; [`${K}__gte`]: T; [`${K}__lt`]: T; [`${K}__lte`]: T; } : T extends object ? { [`${K}__in`]: Array<string | T>; } : {}; // 处理单个字段的基础类型 type FilterField<T> = T extends object ? string | T : T; // 核心泛型类型 type FilterFor<T> = { [K in keyof T as string]: FilterField<T[K]>; } & { [K in keyof T as string]: FilterExtensions<T[K], K & string>; }[keyof T];
验证效果
调用 FilterFor<Person> 后生成的类型完全符合需求:
type FilterForPerson = FilterFor<Person>; // 等价于: // interface FilterForPerson { // name: string; // name__in: string[]; // name__search: string; // age: number; // age__gt: number; // age__gte: number; // age__lt: number; // age__lte: number; // birthdate: Date; // birthdate__gt: Date; // birthdate__gte: Date; // birthdate__lt: Date; // birthdate__lte: Date; // foo: string | Foo; // foo__in: Array<string | Foo>; // active: boolean; // }
规则说明
补充说明:已新增日期类型(birthdate)、对象引用类型(foo)、布尔值类型(active)的处理规则:
- 字符串类型:保留原字段,新增
__in(值数组)和__search(匹配字符串)扩展字段 - 数字/日期类型:保留原字段,新增
__gt(大于)、__gte(大于等于)、__lt(小于)、__lte(小于等于)扩展字段 - 对象类型:原字段支持传入对象本身或其ID字符串,新增
__in(对象/ID数组)扩展字段 - 布尔类型:仅保留原字段,无扩展字段
内容的提问来源于stack exchange,提问作者user6750100
相关产品推荐
相关产品推荐

