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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:01:55