一、基础类型体系
- TypeScript 继承 JavaScript 的 8 种基本类型,作为类型系统基础,复杂类型由其组合而成:
- boolean:仅包含
true
和false
两个值。 - string:包含所有字符串(普通字符串、模板字符串均适用)。
- number:包含整数、浮点数、非十进制数(如十六进制
0xffff
)。 - bigint:包含大整数(需后缀
n
,如123n
),与number
不兼容,依赖 ES2020+ 编译目标。 - symbol:包含所有
Symbol()
函数返回值。 - object:包含对象、数组、函数(狭义对象类型)。
- undefined:仅包含值
undefined
,表示未定义。 - null:仅包含值
null
,表示空值。
- boolean:仅包含
- 注意:类型名称均为小写,首字母大写的
Number
等是内置对象,非类型。
二、包装对象类型
- 5 种原始类型(
boolean
、string
、number
、bigint
、symbol
)存在对应的包装对象。 - TypeScript 用大小写区分:
- 小写类型(如
string
):仅包含字面量(如'hello'
)。 - 大写类型(如
String
):包含字面量和包装对象(如new String('hello')
)。
- 小写类型(如
- 建议:优先使用小写类型,因大写类型可能与内置方法参数类型冲突(如
Math.abs()
要求number
)。
三、Object 与 object 类型
类型 | 含义 | 包含范围 | 建议 |
---|---|---|---|
Object | 广义对象(JavaScript 广义对象) | 原始类型值、对象、数组、函数(除 undefined /null ) | 避免使用 |
object | 狭义对象 | 仅对象、数组、函数(不包含原始类型值) | 优先使用 |
- 两者均仅包含内置属性/方法,不包含自定义属性(需额外定义对象类型)。
四、undefined 和 null 的特殊性
- 既是值也是类型,默认可赋值给任何类型变量(与 JavaScript 行为一致)。
- 编译选项
strictNullChecks: true
时:- 不可赋值给其他类型变量(除
any
/unknown
)。 undefined
与null
不可互赋,仅可赋值给自身类型。
- 不可赋值给其他类型变量(除
五、值类型
- 单个值可作为类型(如
let x: 'hello'
仅允许x = 'hello'
)。 const
声明的变量(非对象)会被推断为值类型(如const x = 'hi'
类型为'hi'
)。- 子类型与父类型:子类型(如
5
)可赋值给父类型(如number
),反之不行。
六、联合类型与交叉类型
- 联合类型(
A|B
):值需属于A
或B
(如string|number
允许字符串或数值)。- 需通过“类型缩小”处理(如
typeof
判断、switch
分支)区分具体类型后操作。
- 需通过“类型缩小”处理(如
- 交叉类型(
A&B
):值需同时属于A
和B
(主要用于对象合成,如{a: number} & {b: string}
需同时含a
和b
属性)。
七、类型别名(type 命令)
- 作用:为类型定义别名(如
type Age = number
),增强可读性和可维护性。 - 特性:
- 不可重名,块级作用域。
- 支持嵌套和表达式(如
type Greeting =
hello ${World}``)。 - 编译后会被删除(仅 TypeScript 类型层面有效)。
八、typeof 运算符
- TypeScript 中,
typeof
可获取值的类型(用于类型运算):- 示例:
const a = {x: 0}; type T = typeof a
中T
为{ x: number }
。 - 限制:参数只能是标识符(不可为表达式),且不能是类型本身。
- 示例:
- 与 JavaScript
typeof
区别:TypeScript 类型运算的typeof
编译后会被删除,仅保留值运算的typeof
。
九、块级类型声明
- 类型可在代码块(如
if
块)内声明,仅在当前块内有效(块级作用域)。
十、类型兼容
- 子类型:若类型
A
可赋值给类型B
,则A
是B
的子类型。 - 规则:父类型场景可使用子类型,子类型场景不可使用父类型(因子类型含父类型所有特征,反之不成立)。