TypeScript学习拾遗——TS中的包装类型、Object、object以及{}

前言

在JS中,字符串、数字、布尔值都有对应的包装类型:

  • String
  • Number
  • Boolean

在某些情况下,JS会隐式的对原始类型进行"装箱",例如:

js 复制代码
const str = 'abcde'
str.slice(1, 3)

字符串本身并不是对象,但是却可以调用函数,因为JS自动将其转换为了包装类对象。

那么在TS中是如何处理这个问题的呢?本文将探讨:

  • Stringstring

  • Numbernumber

  • Booleanboolean

  • Objectobject以及{}

TS中的包装类

Number、String、Boolean是类似的,这里以String为例------

在JS中,String是一个类(或者叫构造函数),而在TS中,String作为类型就是String类的实例,我在TypeScript学习拾遗------enum枚举和class的"值类二象性"这篇文章中,曾经讨论过关于类的问题。

通过new String()方式创建的就是String类型的值:

ts 复制代码
const str: String = new String('abc')

原始类型string可以赋值给包装类型String:

ts 复制代码
const str: String = 'abc'

但包装类型String不能赋值给原始类型string:

ts 复制代码
const str: string = new String('abc') // Error: 不能将类型"String"分配给类型"string"。

其原因是:string类型是String类型的子类型,TS只允许子类型的值赋值给父类型的值,反过来不行。

验证二者的关系:

ts 复制代码
type t1 = string extends String ? true : false
//   ^? type t1 = true
type t2 = String extends string ? true : false
//   ^? type t2 = false

包装类型String本质上也是一个对象,因此String可以赋值给object类型:

ts 复制代码
const o: object = new String('a')

JS中的String类是继承自Object类,因此String类型必然也属于Object类型:

ts 复制代码
const o: Object = new String('a')

而对于string,由于它只表示原始类型,不能赋值给object类型:

ts 复制代码
const str: object = 'a' // Error: 不能将类型"string"分配给类型"object"。

但由于string可以隐式的转换为String类型,因此string类型可以赋值给Object类型:

ts 复制代码
const str: Object = 'a'

包装类与Obejct、object的关系

String、string和Object、object之间关系如下:

  • string是String的子类型
ts 复制代码
type t1 = string extends String ? true : false
//   ^? type t1 = true
  • String是object的子类型
ts 复制代码
type t2 = String extends object ? true : false
//   ^? type t2 = true
  • string不是object的子类型
ts 复制代码
type t3 = string extends object ? true : false
//   ^? type t3 = false
  • String是Object的子类型
ts 复制代码
type t4 = String extends Object ? true : false
//   ^? type t4 = true
  • string是Object的子类型
ts 复制代码
type t5 = string extends Object ? true : false
//   ^? type t4 = true
  • object和Object互为子类型
ts 复制代码
type t6 = Object extends object ? true : false
//   ^? type t6 = true
type t7 = object extends Object ? true : false
//   ^? type t7 = true

Object、object以及{}

看到这里,我估计有人头都大了,包装类型和原始类型、对象类型之间,关系错综复杂,例如:

  • string是String的子类型,String是object的子类型,但string不是object的子类型。
  • object和Object互为子类型,但二者并不是同一个类型。

但其实,如果我们忽略object,其他类型之间的关系是非常明确的:

  • Object --> String --> string

  • Object --> Number --> number

  • Object --> Boolean --> boolean

箭头表示继承方向,后者是前者是子类型,这意味着后者可以赋值给前者。

至于object,其实也不难理解,它表示的是"纯对象类型"或"非原始类型"------除原始类型以外,所有对象类型,都是object的子类型,当然也包括包装类型。因此就有:

  • object --> String

  • object --> Number

  • object --> Boolean

  • object --> Object

另外,所有对象类型本质上都是由Object构造函数创建的,所以object必然是Objcet类的实例,于是:

  • Object --> object

最后顺便一提{}这个特殊类型,它表示的是不含自有属性的Object类型,其实它基本等同于Object:

  • {} --> Object
  • Object --> {}
  • {} --> String --> string
  • {} --> Number --> number
  • {} --> Boolean --> boolean
相关推荐
想睡好4 分钟前
css文本属性
前端·css
qianmoQ5 分钟前
第三章:组件开发实战 - 第五节 - Tailwind CSS 响应式导航栏实现
前端·css
记得早睡~11 分钟前
leetcode150-逆波兰表达式求值
javascript·算法·leetcode
zhoupenghui16818 分钟前
golang时间相关函数总结
服务器·前端·golang·time
White graces32 分钟前
正则表达式效验邮箱格式, 手机号格式, 密码长度
前端·spring boot·spring·正则表达式·java-ee·maven·intellij-idea
庸俗今天不摸鱼33 分钟前
Canvas进阶-4、边界检测(流光,鼠标拖尾)
开发语言·前端·javascript·计算机外设
bubusa~>_<1 小时前
解决npm install 出现error,比如:ERR_SSL_CIPHER_OPERATION_FAILED
前端·npm·node.js
[廾匸]1 小时前
cesium视频投影
javascript·无人机·cesium·cesium.js·视频投影
流烟默2 小时前
vue和微信小程序处理markdown格式数据
前端·vue.js·微信小程序
梨落秋溪、2 小时前
输入框元素覆盖冲突
java·服务器·前端