Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >谈谈{}跟Object以及object的区别

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

作者头像
写代码的阿宗
发布于 2023-11-29 06:22:00
发布于 2023-11-29 06:22:00
26300
代码可运行
举报
文章被收录于专栏:一道题做一宿一道题做一宿
运行总次数:0
代码可运行

在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就不能用了,而{}没有这种检查。这种行为有时候让人迷惑,所以二者选其一,我选{},😁

object

然后就是object类型了。 object{}有一点不同,它不包含原始类型。

object.png

除了这一点,其它的跟{}很相似。

image.png

所以我们应该用哪个呢?

一般情况下,我们应该一个也不用😝。如果我们知道我们数据的具体结构,那单独创建一个type或者interface是最好的。但是在类型编程的时候,我们就得选一个。

比如我们有一个merge函数,用来合并两个对象,把我们可能会这么写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function merge<A extends {},B extends {}>(a:A,b:B):A&B{
    return {
        ...a,
        ...b
    }
}

或者这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function merge<A extends Object,B extends Object>(a:A,b:B):A&B{
    return {
        ...a,
        ...b
    }
}

看起来没问题,但我们传给它原始类型它是可以接受的,结果似乎有点奇怪:

image.png

这大概不是我们写merge函数想要的效果。如果这时候我们把类型参数换成object,问题就迎刃而解了。

image.png

所以:

  1. 用于一些复合对象的情况,选object
  2. 复合对象跟原始类型皆可的情况,选{}
  3. 如果要包含nullundefined的情况,用unknown
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写代码的阿宗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文读懂 TS 中 Object, object, {} 类型之间的区别
TypeScript 2.2 引入了被称为 object 类型的新类型,它用于表示非原始类型。在 JavaScript 中以下类型被视为原始类型:string、boolean、number、bigint、symbol、null 和 undefined。
阿宝哥
2020/04/08
17.9K0
【TypeScript 演化史 — 第八章】字面量类型扩展 和 无类型导入
上一篇更好的类型推断的文章中,解释了 TypeScript 如何用 const 变量和 readonly 属性的字面量始化来推断字面量类型。这篇文章继续讨论这个,扩展和非扩展字面量类型之间的区别。
Javanx
2020/05/09
4.6K0
【TypeScript 演化史 — 第八章】字面量类型扩展 和 无类型导入
TS 进阶 - 类型基础
在 TypeScript 中,null 和 undefined 类型是有具体意义的类型。在没有开启 strictNullChecks 检查时,会被视为其他类型的子类型,如 string 类型会被认为包含了 null 和 undefined。
Cellinlab
2023/05/17
1.8K0
解析赋值、浅拷贝和深拷贝
浅拷贝即 swallow copy,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是其内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。 简而言之,浅拷贝的“浅”在于它的拷贝只停留在一层,即:拷贝第一层的基本类型值,以及第一层的引用类型地址。如图: 拷贝第一层的基本类型值,以及第一层的引用类型地址。
Chor
2019/11/07
5970
深入学习 JavaScript——Object 对象
JavaScript的世界中「一切皆是对象」,而所有对象的起源就是 Object 对象。
李振
2021/11/26
6390
知识点梳理
1.ECMAScript和javaScript的关系 可简单概括为:ECMAScript是JavaScript的规范,JavaScript是ECMAScript的实现。 红宝书第一章小结: js是一种专为与网页交互而设计的脚本语言,由下列三个不同部分组成: 核心ECMAScript,提供核心语言功能; 文档对象模型(DOM),提供访问和操作网页内容的方法和接口; 浏览器对象模型(BOM),提供与浏览器交互的方法和接口。 JavaScript实现了ECMAScript规范(同样实现ECMAScript的还有A
小胖
2018/06/28
7150
TS 进阶 - 类型系统
TypeScript 的类型系统特性:结构化类型系统。TypeScript 比较两个类型并非通过类型的名称,而是比较两个类型上实际拥有的属性与方法。Cat 与 Dog 类型上的方法是一致的,所以虽然是名字不同的类型,但仍然被视为结构一致。
Cellinlab
2023/05/17
1.2K0
TS 进阶 - 类型系统
Java常用类(一)之Object类详解
大家都知道Object是所有类的父类,任何类都默认继承Object 理论上Object类是所有类的父类,即直接或间接的继承java.lang.Object类。由于所有的类都继承在Object类,因此省略了extends Object关键字。 该类中主要有以下方法: toString(),getClass(),equals(),clone(),finalize(), 其中toString(),getClass(),equals是其中最重要的方法。 注意:     Object类中的getClass(),not
用户1195962
2018/01/18
7630
Java常用类(一)之Object类详解
Object对象
Object对象是JavaScript中两个顶层对象之一,提供方法供直接调用以及原型链继承调用。
WindRunnerMax
2020/08/27
2.3K0
深入理解执行上下文和执行栈
执行上下文、执行栈、作用域链、闭包,这其实是一整套相关的东西,之前转载的文章也有讲到这些。下面两篇文章会更加详细地解释这些概念。
Chor
2019/11/07
7810
【Vue3+TypeScript】CRM系统项目搭建之 — 关于拥抱 TypeScript 这件事【上】
string 、 number 、 boolean 、 null 、 undefined 、 bigint 、 symbol 、 object
HelloWorldZ
2024/03/20
1320
【Vue3+TypeScript】CRM系统项目搭建之 — 关于拥抱 TypeScript 这件事【上】
深入理解泛型
泛型类:泛型类最常见的用途就是作为容纳不同类型数据的容器类,比如 Java 集合容器类。
用户7353950
2022/05/10
4680
Day17:web前端开发面试题
Undefined 在 JavaScript 中,没有值的变量,其值是 undefined。typeof 也返回 undefined。
达达前端
2019/07/30
6510
Day17:web前端开发面试题
一份不可多得的TypeScript系统入门整理
函数声明(Function Declaration)和函数表达式(Function Expression)
@超人
2021/07/29
1.8K0
一份不可多得的TypeScript系统入门整理
已阅冴羽大佬文章
https://juejin.cn/post/6958361473953300488
达达前端
2021/05/06
9500
【万字长文】TypeScript入门指南
本文主要讲述叶秋学长通过一个月对TypeScript的学习整理出一份完整的入门指南,希望对正在学习前端的小伙伴有所帮助~
叶秋学长
2023/12/07
6520
【万字长文】TypeScript入门指南
【TypeScript】never 和 unknown 的优雅之道
1、前言  TypeScript 在版本 2.0 和 3.0 分别引入了 “never” 和 “unknown” 两个基本类型,在引入这两个类型之后,TypeScript 的类型系统得到了极大的完善。 但在我平时接手代码的时候,我发现很多同学的观念还停留在 1.0 的时代,那个 any 大法好的时代。毕竟 JavaScript 是一门弱类型动态语言,我们以往不会投入过多的时间去关注类型设计。在引入 TypeScript 之后,我们甚至还会抱怨:“这代码怎么还越写越多了?”。 其实我们应该反过来思考,OOP
用户1097444
2022/06/29
1.3K0
【TypeScript】never 和 unknown 的优雅之道
一个合格的中级前端工程师需要掌握的技能笔记(中)
每天学习编程,让你离梦想更新一步,感谢不负每一份热爱编程的程序员,不论知识点多么奇葩,和我一起,让那一颗四处流荡的心定下来,一直走下去,加油,2021加油!欢迎关注加我vx:xiaoda0423,欢迎点赞、收藏和评论
达达前端
2021/06/10
6200
一个合格的中级前端工程师需要掌握的技能笔记(中)
LINQ凭什么被誉为有史以来最好的技术?
今天来聊一下LINQ,这是笔者最喜欢的技术之一,在艰难时刻,它总能使笔者保持积极状态。如果对其一无所知,笔者敢肯定,经过讲解,你明天就会开始使用它。
人工智能小咖
2020/05/08
1.2K0
LINQ凭什么被誉为有史以来最好的技术?
es6 Object.assign
  Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。只要有一个参数不是对象,就会抛出TypeError错误。
超然
2018/08/03
6630
es6 Object.assign
相关推荐
一文读懂 TS 中 Object, object, {} 类型之间的区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验