如何限制函数仅接受对应属性为Array类型的keyof参数?
解决TypeScript函数参数限制为数组类型键的问题
要实现仅允许传入对应属性为数组类型的键,你可以通过条件类型筛选目标键,具体实现如下:
1. 定义筛选数组键的工具类型
先写一个工具类型,专门提取对象类型中属性为数组的键:
type ArrayKeys<T> = { [K in keyof T]: T[K] extends Array<any> ? K : never }[keyof T]
这个类型会遍历对象T的所有键:
- 若当前键对应的属性是数组类型,保留该键
- 否则将其设为
never(会被自动排除)
最后通过[keyof T]提取所有有效键。
2. 修改getKey函数的类型约束
把函数的key参数类型替换为上面定义的ArrayKeys<T>,同时优化返回值类型以保证类型安全:
// 你的原始类型定义 type TestType = { arrayKey: Array<number>, notArrayKey: number } // 筛选数组键的工具类型 type ArrayKeys<T> = { [K in keyof T]: T[K] extends Array<any> ? K : never }[keyof T] // 优化后的getKey函数 const getKey = <T>(object: T, key: ArrayKeys<T>): T[typeof key] => { return object[key] } // 测试验证 getKey({} as TestType, 'arrayKey') // 正常通过,返回类型为number[] getKey({} as TestType, 'notArrayKey') // 直接报错,符合预期
额外优化
如果需要兼容只读数组(ReadonlyArray),可以调整工具类型的判断条件:
type ArrayKeys<T> = { [K in keyof T]: T[K] extends Array<any> | ReadonlyArray<any> ? K : never }[keyof T]
内容的提问来源于stack exchange,提问作者fauh45
相关产品推荐
相关产品推荐

