谈谈{}跟Object以及object的区别

2023-11-29 14:22:00 浏览数 (1)

在TS中,相信很多人搞不清Objectobject以及{}之间的关系,或者没有深究过,觉得他们只是同一个类型的不同别名,其实不然,每一个的存在都是有原因的。今天我们一起来探究他们的不同之处。

{}

{}包含了除了nullundefined所有的类型,类似于这样:

image.png

(这也是{}unknown的区别,unknown可以包含nullundefined)

但是它对它所指向的对象一无所知,访问任何属性或者方法都会报找不到:

image.png

{}就像一个大集合,包含了其他的类型。

{}

其实整个类型系统都是如此,类型表示值的集合。在我们日常coding过程中,时不时会遇到Argument of type 'xxx' is not assignable to parameter of type 'xxx'.的报错,其实就是看我们要赋的值在不在我们声明的对象的集合里面。(比如"foo"|"bar"这种literal type可以赋给接受string类型的变量)。

Object

类似于{},所有拥有Object原型的值都能赋给Object作为类型的变量。

image.png

但是有一丢丢规则,值的原型里得有Object(当然了,JS的大部分值都是有的)。

Object1.png

它所指向的对象一无所知,访问任何属性或者方法都会报找不到:

image.png

需要注意,Object对于对象里的某些方法是有要求的(比如Object原型对象的toString方法):

image.png

这里Object就不能用了,而{}没有这种检查。这种行为有时候让人迷惑,所以二者选其一,我选{}

0 人点赞