TypeScript实现获取对象指定非null键的带类型提示函数
实现带类型安全的
getRequired函数,处理含null值的对象 需求说明
给定一个所有键类型均为「原始类型 | null」的对象,例如:
const exampleObj = {name: 'John', surname: 'Doe', age: '77', gender: null};
需要实现getRequired函数,满足:
- 传入对象和指定键数组
- 若所有指定键在对象中存在且对应值非null,则返回移除null类型的对应对象
- 若任意指定键不存在或值为null,返回
undefined
示例:
- 传入
['name','surname','age','gender']→ 返回undefined(因为gender值为null) - 传入
['name','surname','age']→ 返回{name: string, surname: string, age: string}(自动移除null类型)
解决方案(TypeScript)
通过泛型和类型守卫实现类型安全的函数:
1. 定义核心类型
首先定义工具类型,提取对象中指定键的非null类型:
// 提取T中K对应的非null类型 type RequiredNonNull<T, K extends keyof T> = { [P in K]: Exclude<T[P], null>; };
2. 实现getRequired函数
结合类型检查和运行时验证:
function getRequired<T extends object, K extends keyof T>( obj: T, keys: K[] ): RequiredNonNull<T, K> | undefined { const result: Partial<RequiredNonNull<T, K>> = {}; for (const key of keys) { // 检查键是否存在于对象中,且对应值不为null if (!(key in obj) || obj[key] === null) { return undefined; } // 断言值为非null类型并赋值 result[key] = obj[key] as Exclude<T[typeof key], null>; } // 断言结果为完整的非null类型对象 return result as RequiredNonNull<T, K>; }
3. 测试示例
const exampleObj = {name: 'John', surname: 'Doe', age: '77', gender: null} as const; // 示例1:包含gender,返回undefined const result1 = getRequired(exampleObj, ['name','surname','age','gender']); // 类型:undefined // 示例2:不包含gender,返回非null类型对象 const result2 = getRequired(exampleObj, ['name','surname','age']); // 类型:{ name: "John"; surname: "Doe"; age: "77" } | undefined // 运行时成功时,result2会是对应的对象,可直接访问属性无需额外null检查
类型说明
Exclude<T[P], null>:移除原始类型中的null选项,确保返回对象的属性类型不含nullRequiredNonNull<T, K>:构建仅包含指定键、且键类型为非null的新类型- 泛型
T和K:让函数自动推断输入对象和键数组的类型,保证类型安全
内容的提问来源于stack exchange,提问作者user3623300
相关产品推荐
相关产品推荐

