我有这个断言函数,它判断传递的值是否为对象(根据typeof操作符),但不包括null:

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

我想给这个函数加一个assertion signature,这样它在使用时有助于缩小类型范围.在这里使用的"最正确"类型是什么?

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

{[key: string | number | symbol]: unknown}Record<keyof unknown, unknown>Object,还是别的什么?

我正在寻找符合TypeScrip对这种类型应该是什么的理解的类型.我知道TypeScrip有许多设置可以稍微影响这一点,而且JavaScript引擎有怪癖和错误,可能会导致与这种理解相矛盾的结果.因此,可能不存在唯一的最佳答案.

推荐答案

您要寻找的是object类型,它代表任何非基元类型.请避免使用Object,这是一个JAVASCRIPT类,建议在官方Do's and Don'ts中避免.

object允许我们确保分配给类型的值不是原始值:

const noError: {toString(): string} = 1
const withError: object & {toString(): string} = 1;

基本上,您可以将任何值与object相交,以确保该类型不允许原始值.

要更好地理解Typescript 中的集合论,请参阅这blog post

Typescript相关问答推荐

参数类型undefined不能分配给参数类型字符串|未定义

TypeScript:在作为参数传递给另一个函数的记录中对函数的参数实现类型约束

如何使用函数填充对象?

如何判断对象是否有重叠的叶子并产生有用的错误消息

类型脚本返回的类型包含无意义的泛型类型名称

在另一个类型的函数中,编译器不会推断模板文字类型

如何将别名添加到vitest配置文件?

将具有Readonly数组属性的对象接口转换为数组

如何从MAT-FORM-FIELD-MAT-SELECT中移除焦点?

我在Angular 17中的environment.ts文件中得到了一个属性端点错误

基于泛型的条件接口键

TS2739将接口类型变量赋值给具体变量

将超类型断言为类型脚本中的泛型参数

如何在Reaction 18、Reaction-Rout6中的导航栏中获取路由参数

是否可以定义引用另一行中的类型参数的类型?

为什么看起来相似的代码在打字时会产生不同的错误?

基于闭包类型缩小泛型类型脚本函数的范围

Typescript不允许在数组中使用联合类型

基于泛型类型的条件类型,具有条目属性判断

有没有办法将类型与关键更改相匹配?