TS的类型
类型
在 TypeScript 中,主要有以下几种类型:
基础类型(Primitive Types):
number
:数值类型,支持整数和浮点数。string
:字符串类型,表示文本。boolean
:布尔类型,只有true
和false
两个值。null
:表示空值或无值。undefined
:表示未定义,通常表示变量已声明但未赋值。symbol
:表示独一无二的值,通常用于对象属性的唯一标识。
对象类型(Object Types):
object
:表示所有非原始类型的值。- 数组:如
number[]
或Array<number>
,表示数值数组。 - 元组:如
[string, number]
,表示具有固定数量和固定类型的数组。 - 枚举(
enum
):表示一组命名的常量,如enum Color { Red, Green, Blue }
。 - 接口(
interface
):用于描述对象的结构,可以定义属性和方法。 - 类型别名(
type
):可以用于定义基本类型、对象类型、联合类型等的别名。
联合类型(Union Types):
- 表示一个值可以是多个类型中的一种,如
string | number
。
交叉类型(Intersection Types):
- 表示一个类型是多个类型的组合,如
type A = {name: string} & {age: number}
。
任何类型(any):
- 表示任意类型,可以赋值为任何类型的变量,但会失去类型检查的好处。
未知类型(unknown):
- 表示未知类型,类型检查更严格,必须进行类型检查后才能使用。
void 类型:
- 通常用于表示没有返回值的函数的返回类型。
never 类型:
- 表示永远不会有值的类型,比如抛出异常的函数。
自定义类型
1 | interface ReportItem { |
类型有多种可能
1 | heightRemaining: number | string | undefined |
区别
heightRemaining: number | undefined
和 heightRemaining?: number
的区别
heightRemaining: number | undefined
这种声明方式明确指出,heightRemaining
,这个属性的类型可以是number
,也可以是undefined
。
也就是说,在对象里必须有这个属性,不过它的值可以是undefined
。
1 | interface Config { |
heightRemaining?: number
这里的?
表示该属性是可选的。这意味着对象中可以不包含这个属性,而且当属性不存在时,它隐含的类型其实是number | undefined
1 | interface Config { |
object 和Object
在 TypeScript 里,object
和 Object
(首字母大写)是不同的类型,下面来详细说明它们的区别。
object
类型
object
代表的是非原始类型,也就是说它不包含 number
、string
、boolean
、bigint
、symbol
、null
以及 undefined
这些类型,只涵盖对象类型。
1 | // 可以将对象赋值给 `object` 类型 |
Object
类型
Object
是一个内置的接口,它表示所有类型的基类型。任何类型的值都能赋值给 Object
,这其中包括原始类型。
1 | const obj1: Object = { name: 'John' }; |
主要区别
特性 | object |
Object |
---|---|---|
能否包含原始类型 | 不能 | 可以 |
常用场景 | 用于函数参数,表明需要传入对象 | 很少使用,一般在需要处理任意值的时候才会用到 |
可访问的属性 | 没有预定义属性 | 有 toString() 、valueOf() 等属性和方法 |
any和object
any
和 object
是两个不同的类型,它们的设计目的和使用场景有显著区别。
基本定义与核心区别
any
类型
- 定义:
any
表示任意类型,它可以绕过 TypeScript 的类型检查,允许赋值为任何类型的值,调用任何方法或属性。 - 特点:完全失去类型检查,是 TypeScript 中的 “动态类型”。
- 风险:可能导致运行时错误,因为编译器不会对
any
类型的值进行类型检查。
1 | let value: any = "hello"; |
object
类型
- 定义:
object
表示非原始类型(即不是number
、string
、boolean
、bigint
、symbol
、null
或undefined
的类型),主要用于表示对象、数组、函数等。 - 特点:是一个具体的类型,要求值必须是对象类型,但不关心对象的具体结构。
- 安全:相比
any
,object
保留了一定的类型安全性,因为它不允许直接访问未知属性。
1 | let obj: object = { name: "John" }; |
主要差异对比
特性 | any |
object |
---|---|---|
允许的赋值类型 | 任何类型(原始值、对象、函数等) | 仅非原始类型(对象、数组、函数) |
类型检查 | 无(绕过所有类型检查) | 有限检查(确保是对象类型) |
属性访问 | 允许访问任何属性和方法 | 只能访问 Object.prototype 上的属性(如 toString() ) |
使用场景 | 动态数据、与 JavaScript 交互、临时绕过类型检查 | 需要明确表示 “对象” 的场景(如函数参数、接口字段) |
安全风险 | 高(可能导致运行时错误) | 低(保留基本类型安全) |
JS的类型
在 JavaScript 中,主要有以下几种数据类型:
基本数据类型(Primitive Types):
number
:数值类型,包括整数和浮点数。string
:字符串类型,用于表示文本。boolean
:布尔类型,表示逻辑值true
或false
。undefined
:表示变量已声明但未赋值。null
:表示空值或无值,通常用于显式地表示“无”。symbol
(ES6 引入):表示独一无二的值,主要用于对象属性的唯一标识。bigint
(ES11 引入):表示任意精度的整数,适用于大于Number.MAX_SAFE_INTEGER
的整数值。
对象类型(Object Types):
object
:用于表示各种复杂的数据结构,如对象字面量、数组、函数、日期等。
- 数组(Array):用于存储有序的元素集合,如
[1, 2, 3]
。 - 函数(Function):可以被调用的对象,用于执行代码块。
- 日期(Date):表示日期和时间的对象。
- 正则表达式(RegExp):用于匹配字符串模式的对象。
JavaScript 的数据类型可以分为原始类型(基本类型)和引用类型(对象类型)。
原始类型是不可变的,而对象类型是可变的。
基本数据类型在内存中存储的是值本身,而对象类型在内存中存储的是对实际数据的引用。
类型判断