TypeScript(TS)中的类型介绍

TS的类型

类型

在 TypeScript 中,主要有以下几种类型:

基础类型(Primitive Types)

  • number:数值类型,支持整数和浮点数。
  • string:字符串类型,表示文本。
  • boolean:布尔类型,只有 truefalse 两个值。
  • 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
2
3
4
5
6
7
8
9
interface ReportItem {
compType: number //组件类型 1 一级标题 2 二级标题 3 图表 4 表格 5 Info 6 分析诊断
content: string
heightItem: number
heightRemaining: number
fiexNum?: number
tableHeader?: ReportTableHeader[]
tableData?: object[]
}

类型有多种可能

1
heightRemaining: number | string | undefined

区别

heightRemaining: number | undefinedheightRemaining?: number的区别

heightRemaining: number | undefined

这种声明方式明确指出,heightRemaining,这个属性的类型可以是number,也可以是undefined

也就是说,在对象里必须有这个属性,不过它的值可以是undefined

1
2
3
4
5
6
7
interface Config {
heightRemaining: number | undefined;
}

const config: Config = {
heightRemaining: undefined // 合法
};

heightRemaining?: number

这里的?表示该属性是可选的。这意味着对象中可以不包含这个属性,而且当属性不存在时,它隐含的类型其实是number | undefined

1
2
3
4
5
6
7
interface Config {
heightRemaining?: number;
}

const config: Config = {
// 可以不包含 heightRemaining 属性
};

object 和Object

在 TypeScript 里,objectObject(首字母大写)是不同的类型,下面来详细说明它们的区别。

object 类型

object 代表的是非原始类型,也就是说它不包含 numberstringbooleanbigintsymbolnull 以及 undefined 这些类型,只涵盖对象类型。

1
2
3
4
5
6
7
// 可以将对象赋值给 `object` 类型
const obj1: object = { name: 'John' };
const obj2: object = []; // 数组也是对象
const obj3: object = () => {}; // 函数同样是对象

// 但不能将原始类型赋值给 `object` 类型
const num: object = 123; // 报错:Type 'number' is not assignable to type 'object'.

Object 类型

Object 是一个内置的接口,它表示所有类型的基类型。任何类型的值都能赋值给 Object,这其中包括原始类型。

1
2
3
4
5
6
7
const obj1: Object = { name: 'John' };
const obj2: Object = 123; // 不会报错
const obj3: Object = true; // 同样不会报错

// 所有对象都继承了 Object 的属性和方法
console.log(obj1.toString()); // 可以调用,输出 "[object Object]"
console.log(obj2.toString()); // 也能调用,输出 "123"

主要区别

特性 object Object
能否包含原始类型 不能 可以
常用场景 用于函数参数,表明需要传入对象 很少使用,一般在需要处理任意值的时候才会用到
可访问的属性 没有预定义属性 toString()valueOf() 等属性和方法

any和object

anyobject 是两个不同的类型,它们的设计目的和使用场景有显著区别。

基本定义与核心区别

any 类型

  • 定义any 表示任意类型,它可以绕过 TypeScript 的类型检查,允许赋值为任何类型的值,调用任何方法或属性。
  • 特点:完全失去类型检查,是 TypeScript 中的 “动态类型”。
  • 风险:可能导致运行时错误,因为编译器不会对 any 类型的值进行类型检查。
1
2
3
let value: any = "hello";
value = 123; // 合法
value.unknownMethod(); // 合法,运行时可能出错

object 类型

  • 定义object 表示非原始类型(即不是 numberstringbooleanbigintsymbolnullundefined 的类型),主要用于表示对象、数组、函数等。
  • 特点:是一个具体的类型,要求值必须是对象类型,但不关心对象的具体结构。
  • 安全:相比 anyobject 保留了一定的类型安全性,因为它不允许直接访问未知属性。
1
2
3
4
let obj: object = { name: "John" };
obj = [1, 2, 3]; // 合法,数组是对象
obj = () => {}; // 合法,函数是对象
obj.name; // 错误:对象类型没有已知属性"name"

主要差异对比

特性 any object
允许的赋值类型 任何类型(原始值、对象、函数等) 仅非原始类型(对象、数组、函数)
类型检查 无(绕过所有类型检查) 有限检查(确保是对象类型)
属性访问 允许访问任何属性和方法 只能访问 Object.prototype 上的属性(如 toString()
使用场景 动态数据、与 JavaScript 交互、临时绕过类型检查 需要明确表示 “对象” 的场景(如函数参数、接口字段)
安全风险 高(可能导致运行时错误) 低(保留基本类型安全)

JS的类型

在 JavaScript 中,主要有以下几种数据类型:

基本数据类型(Primitive Types)

  • number:数值类型,包括整数和浮点数。
  • string:字符串类型,用于表示文本。
  • boolean:布尔类型,表示逻辑值 truefalse
  • undefined:表示变量已声明但未赋值。
  • null:表示空值或无值,通常用于显式地表示“无”。
  • symbol(ES6 引入):表示独一无二的值,主要用于对象属性的唯一标识。
  • bigint(ES11 引入):表示任意精度的整数,适用于大于 Number.MAX_SAFE_INTEGER 的整数值。

对象类型(Object Types)

object:用于表示各种复杂的数据结构,如对象字面量、数组、函数、日期等。

  • 数组(Array):用于存储有序的元素集合,如 [1, 2, 3]
  • 函数(Function):可以被调用的对象,用于执行代码块。
  • 日期(Date):表示日期和时间的对象。
  • 正则表达式(RegExp):用于匹配字符串模式的对象。

JavaScript 的数据类型可以分为原始类型(基本类型)和引用类型(对象类型)。

原始类型是不可变的,而对象类型是可变的。

基本数据类型在内存中存储的是值本身,而对象类型在内存中存储的是对实际数据的引用。

类型判断

https://www.psvmc.cn/article/2018-12-20-js-type.html