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

如何在TypeScript类中编写泛型方法为数组属性添元素并移除unknown断言

解决方法

要移除unknown类型断言,核心是精确约束泛型参数的范围,让TypeScript能自动推导属性的数组类型,无需手动断言。

修改后的实现代码

export class FilterClass {
  searchText = '';
  someFilter: FilterType[] = [];
  otherFilter: OtherFilterType[] = [];

  setSearchText(searchText: string) {
    this.searchText = searchText;
  }

  addFilter<K extends keyof FilterClass>(
    arrayName: K extends FilterClass[K] extends Array<infer T> ? K : never,
    filterToAdd: FilterClass[K] extends Array<infer T> ? T : never
  ) {
    this[arrayName].push(filterToAdd);
  }
}

更简洁的写法(借助工具类型)

先定义一个工具类型,专门提取类中值为数组的属性键:

// 工具类型:提取对象中值为数组类型的属性键
type ArrayPropertyKeys<T> = {
  [K in keyof T]: T[K] extends Array<any> ? K : never;
}[keyof T];

export class FilterClass {
  searchText = '';
  someFilter: FilterType[] = [];
  otherFilter: OtherFilterType[] = [];

  setSearchText(searchText: string) {
    this.searchText = searchText;
  }

  addFilter<K extends ArrayPropertyKeys<FilterClass>>(
    arrayName: K,
    filterToAdd: FilterClass[K][number]
  ) {
    this[arrayName].push(filterToAdd);
  }
}

关键说明

  1. 约束属性范围:通过ArrayPropertyKeys工具类型,让K只能是FilterClass中值为数组的属性(也就是someFilter和otherFilter),排除了searchText这类非数组属性。
  2. 自动推导元素类型:FilterClass[K][number]直接获取对应数组的元素类型(比如FilterType或OtherFilterType),无需额外定义泛型参数T。
  3. 无需断言:此时TypeScript明确知道this[arrayName]是数组类型,直接调用push方法即可,完全不需要unknown或其他类型断言。

内容的提问来源于stack exchange,提问作者Przemek Wit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:39:32