TypeScript实现仅接受值为数组类型的对象键的函数
TypeScript 筛选对象中值为数组类型的键作为函数参数
要实现仅接受对象中值为数组类型的键作为参数,同时让IDE提供精准的自动提示,可以通过条件映射类型筛选符合要求的键,再约束函数参数。
步骤1:定义筛选数组类型键的工具类型
// 提取对象T中值为数组类型的所有键 type ArrayKeys<T> = { [K in keyof T]: T[K] extends Array<any> ? K : never; }[keyof T];
步骤2:重写get函数
用上面的ArrayKeys<T>约束第二个参数的类型:
function get<T, Key extends ArrayKeys<T>>(container: T, key: Key) { return container[key]; }
测试效果
const person = { name: 'Amir', age: 25, favoriteFruits: ['Apple', 'Orange'] }; // 调用时IDE仅提示'favoriteFruits',符合预期 get(person, 'favoriteFruits'); // 传入非数组类型的键会直接触发类型报错 get(person, 'name'); // 类型错误:"name"不能赋值给类型"favoriteFruits"
原理说明
ArrayKeys<T>通过遍历对象的所有键,判断对应值是否为数组类型:符合条件的键保留原类型,不符合的设为never。- 最后通过
[keyof T]从映射结果中提取所有有效的键(never类型会被自动排除),以此约束函数的Key类型,实现精准的参数提示和类型校验。
内容的提问来源于stack exchange,提问作者AG_1380
相关产品推荐
相关产品推荐

