- 相关术语
- 装箱(Boxing)
- 拆箱(Unboxing)
- 原始类型(Primitive types)例如
string
number
boolean
- 包装类(Object Wrapper types)例如
String
Number
Boolean
- 在 TypeScript(或 JavaScript)中,与传统的面向对象编程语言(如 C# 或 Java)相比,”装箱”(boxing)和”拆箱”(unboxing)这两个概念并不是主流或常用的术语。
- 在 ts 和 js 中,装箱和拆箱的概念主要是关于原始类型和它们的对象包装类型之间的转换。
- 装箱:把一个原始类型的值转换成它的对象包装类型。
- 拆箱:把一个对象包装类型的值转换回它的原始类型。
// 装箱
let boxedString: String = new String('hello')
// 拆箱
let unboxedString: string = boxedString.valueOf()
- 在 ts 中,使用原始类型是推荐的做法。原始类型在运行时更高效,而且在 ts 中提供了更好的类型安全性。
- 对象包装类型在 ts 中不常用,特别是要避免把它们用作构造函数,因为这可能会引发类型错误。
- 约束布尔值
boolean
- 约束数字
number
- 约束字符串
string
- 装箱类型(Boxed Types)
Object
、Boolean
、Number
、String
、Symbol
……- 永远不要使用装箱类型。
- 在 ts 中,允许你使用
Number
、String
、Boolean
…… 作为类型注释,但是最好不要这么做Boolean
不等于boolean
,但是let a: Boolean = false
是 ok 的Number
不等于number
,但是let a: Number = 1
是 ok 的String
不等于string
,但是let a: String = '1'
是 ok 的- ……
- 由于 ts 知道 js 中存在包装类机制,因此上述这些写法在 ts 中是被允许的,但是并不推荐
let a: boolean = false // ok
let b: Boolean = new Boolean(true) // ok
let a: boolean = new Boolean(true) // error
let b: Boolean = false // ok
let a: boolean = new Boolean(true)
这种写法是 error 的,因为 new Boolean(true)
返回的实际上是一个对象,并非基础数据类型 boolean
。
let b: Boolean = false
这种写法是 ok 的,这是因为 js 中的包装类机制,即在 js 中,所有基础的数据类型,都可以临时视作对象来用。ts 知道这一点,因此 ts 允许你使用 Number
,String
,Boolean
作为类型注释。但是,为了清晰性和减少混淆,通常建议使用小写的基本数据类型名称(number
,string
,boolean
)作为 ts 类型注释,除非你确实需要一个包装对象。