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

如何为TypeScript泛型函数指定与keyof匹配的参数类型?

解决TypeScript泛型函数的属性值类型匹配问题

要实现让value类型与指定key对应的属性类型严格匹配的泛型函数,你需要新增一个类型参数来捕获具体的键名,进而约束value的类型。

修改后的函数定义如下:

public filterByPropertyValue<T, K extends keyof T>(array: T[], key: K, value: T[K]) {
  return array.filter(e => e[key] === value);
}

核心原理

  • 新增的K extends keyof T类型参数,会精准捕获传入的具体键名(比如'a'或'b')
  • T[K]表示类型T中键K对应的属性类型,这样value的类型就会和key绑定的属性类型严格对齐

验证效果

  • 符合要求的调用(TypeScript正常通过):
    const array: ITest[] = [ {a: 1, b: 'some'}, {a: 2, b: 'value'}];
    
    filterByPropertyValue<ITest>(array, 'a', 1) // 返回array[0]
    filterByPropertyValue<ITest>(array, 'b', 'value') // 返回array[1]
    filterByPropertyValue<ITest>(array, 'b', 'foobar') // 返回空数组
    
  • 不符合要求的调用(TypeScript直接报错):
    filterByPropertyValue<ITest>(array, 'a', 'abc') // 错误:'abc'是string类型,与'a'对应的number类型不匹配
    filterByPropertyValue<ITest>(array, 'b', 15) // 错误:15是number类型,与'b'对应的string类型不匹配
    

额外优化:你甚至可以省略显式的泛型参数<ITest>,TypeScript会自动推导类型:

filterByPropertyValue(array, 'a', 1) // 自动识别T为ITest,K为'a'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:57:10