如何为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
相关产品推荐
相关产品推荐

