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

如何实现带修改键名的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:06:10