如何在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); } }
关键说明
- 约束属性范围:通过
ArrayPropertyKeys工具类型,让K只能是FilterClass中值为数组的属性(也就是someFilter和otherFilter),排除了searchText这类非数组属性。 - 自动推导元素类型:
FilterClass[K][number]直接获取对应数组的元素类型(比如FilterType或OtherFilterType),无需额外定义泛型参数T。 - 无需断言:此时TypeScript明确知道
this[arrayName]是数组类型,直接调用push方法即可,完全不需要unknown或其他类型断言。
内容的提问来源于stack exchange,提问作者Przemek Wit
相关产品推荐
相关产品推荐

