TypeScript:获取keyof T对应键类型,实现泛型函数类型约束
解决Observable可复用函数的类型推导问题
你代码里的typeof keyof T写法存在错误,keyof T返回的是T的属性名联合类型,typeof作用于它只能得到string | number | symbol,无法关联到具体属性对应的value类型。要实现根据传入的key自动推导value的正确类型,需要引入额外的泛型参数来约束key,具体修正如下:
getByKey<T extends BasicApiResponse, K extends keyof T>( data: Observable<T[]>, key: K, value: T[K] ): Observable<T> { return data.pipe( filter((items) => !!items), map((items) => items.find((e) => e[key] === value)), filter((item) => !!item), distinctUntilChanged((prev, curr) => isEqual(prev, curr)) ); }
说明:
- 新增泛型参数
K并约束为keyof T,用来明确传入的key是T的某个具体属性 - 将
value的类型指定为T[K],这样TypeScript就能根据传入的key,自动推导出该属性对应的value类型
验证效果:
import { of } from 'rxjs'; const obs = of([{ id: 'item-1', index: 2 }]) getByKey(obs, 'id', 'item-1'); // 类型检查通过,正常运行 getByKey(obs, 'index', '2'); // TypeScript会报错,提示"string"类型不能赋值给"number"类型
内容的提问来源于stack exchange,提问作者Ewan
相关产品推荐
相关产品推荐

