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

如何编写可自动识别传入类型的TypeScript Filter接口?

解决方案:让Filter接口支持动态data类型

1. 重构Filter接口为泛型类型

将原来的Filter类改为泛型接口,通过泛型参数定义每个键对应的data类型,既保留类型检查能力,又能灵活适配不同的data类型:

// filter.interface.ts
// 单个过滤项的基础类型,支持指定data的具体类型
export type FilterItem<T> = {
  isLoading: boolean;
  data: T;
};

// 整体Filter类型,泛型T描述每个键对应的data类型
export type Filter<T extends Record<string, any>> = {
  [K in keyof T]: FilterItem<T[K]>;
};

2. 在组件中使用泛型Filter

在组件里,直接通过泛型参数指定当前filters包含的键和对应data类型,IDE会自动识别每个data的具体类型:

// component.ts
public filters: Filter<{
  addressBookTypes: AddressBookType[];
  // 后续新增过滤项直接在这里添加即可,比如:
  // users: User[];
  // departments: Department[];
}> = {
  'addressBookTypes': {
    isLoading: false,
    data: [] as AddressBookType[]
  }
};

3. 可选:用工具函数自动推断类型

如果不想手动编写泛型参数,可以创建工具函数让TypeScript自动推断类型,进一步简化代码:

// filter.interface.ts 新增工具函数
export function createFilters<T extends Record<string, any>>(filters: Filter<T>): Filter<T> {
  return filters;
}

组件中使用方式:

// component.ts
public filters = createFilters({
  'addressBookTypes': {
    isLoading: false,
    data: [] as AddressBookType[]
  },
  'users': {
    isLoading: true,
    data: [] as User[]
  }
});

方案优势

  • 每个data的类型会被严格检查,避免类型错误
  • 无需提前定义所有可能的接口组合,新增过滤项只需在使用时添加对应类型
  • 保留IDE的代码提示,避免拼写错误或结构错误

内容的提问来源于stack exchange,提问作者Kristjan O.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:13:29