You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:45:03