选中 'typeof a === 'object' & a !== null' 后最精确的类型

Most precise type after checking `typeof a === 'object' && a !== null`

提问人:Feuermurmel 提问时间:6/23/2023 最后编辑:Feuermurmel 更新时间:6/25/2023 访问量:61

问:

我有这个断言函数,它检查传递的值是否是一个对象(根据运算符),但不包括:typeofnull

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

我想向此函数添加一个断言签名,以便在使用时有助于缩小类型。这里使用的“最正确”类型是什么?

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

我正在寻找与 TypeScript 对这种类型的理解相匹配的类型。我知道 TypeScript 有许多设置可能会对此产生轻微影响,并且 JavaScript 引擎存在怪癖和错误,可能会导致与这种理解相矛盾的结果。所以可能没有一个最佳答案。

TypeScript 断言 类型缩小

评论

0赞 derpirscher 6/23/2023
也返回,即你也应该检查typeof []"object"!Array.isArray(value)
0赞 wonderflame 6/23/2023
我建议使用这样的东西,正如@derpirscher提到的,你应该检查它是否是一个数组。这种方法对你有用吗?如果是,我会写一个答案来解释;如果没有,我错过了什么?value
0赞 Ricky Mo 6/23/2023
我认为当您断言您的程序在特定用例中关心的确切结构时,断言很有用?断言一个对象似乎并没有提供太多额外的信息来利用。
0赞 Feuermurmel 6/23/2023
@derpirscher我知道数组也是 JavaScript 中的对象。我有意定义我的方式。assertIsObject()
1赞 Feuermurmel 6/23/2023
我认为答案是.至少 TypeScript 在这里是这样推断的:typescriptlang.org/......object

答:

2赞 wonderflame 6/23/2023 #1

你要查找的是对象类型,它表示任何非基元类型。请避免使用哪个是 JavaScript 类,建议在官方的 Do's and Don't 中避免使用。Object

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

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

基本上,您可以与任何内容相交,以确保该类型不允许基元值。object

为了更好地理解打字稿中的集合论,请参阅这篇博文