TypeScript遍历泛型对象属性报索引错误如何按TS规范解决?
问题修复方案
报错原因
Object.keys() 的返回值在 TypeScript 的类型定义中固定为 string[],不会自动推导为泛型 T 的键数组,因此用字符串类型的键索引 T 类型的对象时,会触发类型不匹配报错。这个设计是 TypeScript 故意为之:因为 JavaScript 对象运行时可能存在超出泛型定义的额外属性,所以默认不会将 Object.keys() 的返回值限定为泛型的键范围。
修正代码
import { Observable, map } from 'rxjs'; function valuesOrCondition$<T>(objects: Observable<T[]>, objectWithPropertiesAndValues: Partial<T>) { // 对key数组做类型断言,明确元素为T的合法键,符合业务逻辑的前提下消除类型报错 const properties = Object.keys(objectWithPropertiesAndValues) as (keyof T)[]; return objects.pipe( map(nodes => nodes.filter(node => // 用Array.some替代Array.find,更匹配「任意属性值匹配就保留」的语义,返回值直接为布尔值 properties.some(ppName => node[ppName] === objectWithPropertiesAndValues[ppName] ) )) ); }
说明
本次使用的类型断言是安全的:业务逻辑已经保证入参 objectWithPropertiesAndValues 为 Partial<T> 类型,它的所有键必然是 T 类型上存在的合法属性,因此该断言不会引入类型风险,完全符合 TypeScript 的类型规范。
内容的提问来源于stack exchange,提问作者user16526709
相关产品推荐
相关产品推荐

