为排除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
相关产品推荐
相关产品推荐

