TypeScript泛型如何筛选接口中包含X属性的键作为入参类型
解决方案
你可以先定义一个工具类型过滤出接口I中所有值包含X属性的键,再修改函数的泛型约束即可:
// 工具类型:遍历对象的键,保留值包含X属性的键 type KeysWithPropertyX<T> = { [K in keyof T]: T[K] extends { X: unknown } ? K : never }[keyof T] interface I{ A:{ X:any } B:{ Y:any } C:{ X:any Y:any } } // 泛型约束替换为KeysWithPropertyX<I> function hello<T extends KeysWithPropertyX<I>>(type:T, value:I[T]["X"]):void { // 你的函数逻辑 }
效果验证
- 传入合法值正常通过类型校验:
hello("A", 123) // 无报错 hello("C", "text") // 无报错 - 传入非法值
B会触发类型错误:hello("B", 456) // 类型报错:类型“"B"”的参数不能赋给类型“"A" | "C"”的参数
如果你不想额外定义独立的工具类型,也可以直接把过滤逻辑写在泛型约束里,只是可读性稍低:
function hello<T extends { [K in keyof I]: I[K] extends { X: any } ? K : never }[keyof I]>(type:T, value:I[T]["X"]):void { // 函数逻辑 }
内容的提问来源于stack exchange,提问作者Xiao_e_yun
相关产品推荐
相关产品推荐

