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

为排除null的JS对象断言函数选择适配TypeScript的精准类型

适配TypeScript的断言类型选择

你的断言函数检查的是typeof value === 'object' && value !== null,这个条件会过滤掉原始类型、null和函数(因为typeof function返回'function'),仅保留普通对象、数组、Date、RegExp等内置对象类型。下面逐一分析你给出的可选类型,并给出最优解:

可选类型分析

  • Record<keyof unknown, unknown>:keyof unknown的结果是never,因此这个类型等价于{}(空对象类型),完全无法覆盖数组、Date等符合断言条件的对象,直接排除。
  • Object(大写O):该类型涵盖所有非原始类型,包括函数,但你的断言已经排除了函数,用它会导致类型收窄范围比实际检查的更宽,存在类型不准确的问题。
  • {[key: string | number | symbol]: unknown}:这是带任意索引签名的对象类型,仅适配普通键值对对象;像Date、RegExp这类内置对象,在TypeScript严格模式下无法赋值给该类型,无法覆盖所有符合条件的对象。

最优类型:小写object

TypeScript内置的小写object类型是最适配的选择:

  • 它代表所有非原始值(排除string、number、boolean、symbol、null、undefined),虽然理论上包含函数,但你的断言函数已经通过typeof value !== 'object'排除了函数(函数的typeof结果为'function'),实际使用中不会出现类型不匹配。
  • 作为TypeScript专门用于表示对象的基础类型,类型系统对它的支持最完善,能准确完成类型收窄,覆盖所有符合断言条件的对象。

最终代码:

export function assertIsJavaScriptObjectExceptNull(value: unknown): asserts value is object {
    if (typeof value !== 'object' || value === null) {
        throw Error('Value is not an object.');
    }
}

如果需要更精确地显式排除函数,也可以使用Exclude<object, Function>作为断言类型,但这种写法相对复杂,大多数场景下object类型已足够满足需求。

内容的提问来源于stack exchange,提问作者Feuermurmel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:07:46