如何使用TypeScript泛型实现对象是否为空的检测功能?
TypeScript 非空对象判断泛型实现方案
TS 泛型仅作用于编译期的类型检查,若需要同时满足类型推导和运行时校验能力,可参考以下实现:
1. 编译期类型泛型
基础版本(包含所有对象类型,如数组、函数)
type IsNonEmptyObject<T> = // 第一步:判断输入是否为对象类型,排除非对象和null T extends object // 第二步:判断对象是否存在可枚举键,无键则为空对象 ? keyof T extends never ? false : true : false;
测试效果:
type Test1 = IsNonEmptyObject<{}> // 推导为 false type Test2 = IsNonEmptyObject<{ id: number }> // 推导为 true type Test3 = IsNonEmptyObject<string> // 推导为 false type Test4 = IsNonEmptyObject<null> // 推导为 false
优化版本(仅匹配纯对象,排除数组、函数等特殊对象)
type IsPlainNonEmptyObject<T> = T extends object ? T extends Array<any> | Function ? false : keyof T extends never ? false : true : false;
测试效果:
type Test5 = IsPlainNonEmptyObject<[]> // 推导为 false type Test6 = IsPlainNonEmptyObject<() => void> // 推导为 false type Test7 = IsPlainNonEmptyObject<{ name: string }> // 推导为 true
2. 配套运行时校验函数
TS 类型会在编译后被擦除,如需在运行时做逻辑判断,可结合泛型实现支持类型收窄的校验函数:
function isPlainNonEmptyObject<T>(value: T): value is T extends object ? (T extends Array<any> | Function ? never : (keyof T extends never ? never : T)) : never { // 运行时校验逻辑 if (typeof value !== 'object' || value === null || Array.isArray(value) || typeof value === 'function') { return false } return Object.keys(value).length > 0 }
运行时测试效果:
isPlainNonEmptyObject({}) // false isPlainNonEmptyObject({ age: 18 }) // true isPlainNonEmptyObject([1,2,3]) // false isPlainNonEmptyObject('test') // false isPlainNonEmptyObject(null) // false
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

