3. TypeScript 中的数据类型

article/2025/7/5 17:21:40

在 TypeScript 中,类型(Types)允许你定义并强制执行应用中数据的结构。通过使用类型,你可以在编译阶段捕捉错误,而不是等到运行时才发现,从而让代码更加可预测,也更不容易出现 bug。TypeScript 提供了丰富的类型系统,可以处理从简单的值到复杂对象等各种数据结构。

一、数据类型

在 TypeScript 中,数据类型定义了变量可以保存的值的种类,从而确保类型安全并提升代码的清晰度。

  • 原始类型(Primitive Types):基本类型,如 numberstringbooleannullundefinedsymbol
  • 对象类型(Object Types):复杂结构,包括数组(arrays)、类(classes)、接口(interfaces)和函数(functions)。

(一) 原始类型(Primitive Types)

原始类型是 TypeScript 中最基本的数据类型。它们表示简单的、不可变的值,通常通过直接赋值进行使用。

类型

关键字

描述

Number

number

表示整数和浮点数。

String

string

表示文本数据。

Boolean

boolean

表示逻辑值:truefalse

Null

null

表示有意的空值。

Undefined

undefined

表示尚未初始化的变量。

Symbol

symbol

表示唯一且不可变的值,常用作对象的键。

BigInt

bigint

表示任意精度的整数。

(二) 对象类型(Object Types)

对象类型是更复杂的结构,可以包含多个值和函数。它们是可变的,创建后可以被修改。

类型

描述

Object

表示任何非原始类型;但建议使用更具体的类型替代该类型。

Array

表示特定类型元素的集合。

Tuple

表示具有固定数量和类型的元素数组。

Enum

表示一组命名常量,用于表示相关联的值集合。

Function

表示可调用的实体;可以定义参数和返回值类型。

Class

定义用于创建具有特定属性和方法的对象的蓝图。

Interface

描述对象的形状,指定属性名称及其类型。

(三) 高级类型(Advanced Types)

TypeScript 还提供了一些高级类型,以便进行更复杂的类型定义。

类型

描述

Union

允许变量持有多种类型之一,为类型赋值提供灵活性。

Intersection

将多个类型合并为一个,要求值满足所有包含的类型。

Literal

限定变量只能被赋予某个特定的确切值。

Mapped

通过指定规则对已有类型的属性进行转换,从而创建新类型。

(四) TypeScript 中使用数据类型的最佳实践

  • 使用 letconst 替代 var:使用 letconst 进行块级作用域的变量声明,以避免变量提升和作用域泄露的问题。
  • 避免使用 any 类型:避免使用 any,因为它会绕过类型检查;应优先使用具体的类型以保持类型安全。
  • 利用类型推断:在可能的情况下让 TypeScript 自动推断类型,以减少冗余并提高代码可读性。
  • 使用内置工具类型:利用如 Partial<T>Readonly<T> 等内置工具类型,创建更灵活、可读性更高的类型定义。

二、原始类型

在本文中,我们将学习 TypeScript 中的原始类型:字符串(string)、数字(number)和布尔值(boolean)。这些是最常用和最基本的数据类型。接下来我们将详细介绍 string、number 和 boolean 的使用方法。

(一) typeScript 原始数据类型

TypeScript 原始数据类型与 JavaScript 常用的数据类型类似,TypeScript 主要有三种原始数据类型(Primitives):

1. String(字符串)

TypeScript 中的字符串与句子类似。它们由一系列字符组成,本质上就是一个“字符数组”,例如 "Hello TypeScript" 等。

2. Number(数字)

与 JavaScript 一样,TypeScript 支持 number 数据类型。所有数字在底层都以浮点数形式存储,无论是整数还是小数。

3. Boolean(布尔值)

最基本的数据类型是简单的 truefalse 值,这种类型在 JavaScript 和 TypeScript 中都称为布尔类型(boolean)。

(二) 字符串类型

字符串(string)数据类型表示文本或字符序列。在 JavaScript 和 TypeScript 中,字符串用单引号或双引号括起来。

1. 语法

let 变量名: string = "值";

说明:

  • 变量名(variableName):这是变量的名称。
  • string:这是类型注解,指定该变量应该存储一个字符串。
  • "值"("value"):这是赋给变量的初始值。

2. 示例

在这个示例中,我们将学习字符串的用法。

let greeting: string = "Hello TypeScript";
console.log(greeting);

输出结果:

(三) 数字类型

数字类型表示数值,可以是整数也可以是浮点数。

1. 语法

let 变量名: number = 数值;

2. 说明

  • 变量名(variableName):这是变量的名称。
  • number:这是类型注解,指定该变量应存储一个数值(整数或浮点数)。
  • 数值(numericValue):这是赋给变量的初始数值。

3. 示例

在这个示例中,我们将学习数字类型的用法。

let num: number = 30;
let float: number = 19.99;
console.log(num);
console.log(float);

输出结果:

(四) 布尔类型

布尔类型表示二进制的值,只能是 true(真)或 false(假)。它通常用于条件判断和逻辑运算。

1. 语法

let 变量名: boolean = true | false;

2. 说明

  • 变量名(variableName):这是变量的名称。
  • boolean:这是类型注解,指定该变量应存储一个布尔值(truefalse)。
  • true 或 false:这是赋给变量的初始布尔值。

3. 示例

在这个示例中,我们将学习布尔类型的用法。

let isStudent: boolean = true;
let hasPermission: boolean = false;
console.log(isStudent);
console.log(hasPermission);

输出结果:

三、对象类型

TypeScript 对象是一组键值对的集合,其中键是字符串,值可以是任意数据类型。TypeScript 中的对象可以存储各种类型的数据,包括原始类型、数组和函数,从而提供一种结构化的方式来组织和操作数据。

(一) 什么是 TypeScript 对象?

在 TypeScript 中,对象是包含一组键值对的实例。这些键值对可以包含各种数据类型,包括标量值(如字符串、数字等)、函数,甚至是其他对象的数组
TypeScript 中的“对象”指的是任何非原始值(即不是 string、number、bigint、boolean、symbol、null 或 undefined)。这与空对象类型 {} 不同,也与全局类型 Object 不同。

1. TypeScript 对象类型(TypeScript Objects types)

在 TypeScript 中,对象类型可以通过 接口(interface)类型别名(type alias)索引签名(index signature) 来定义。
接口和类型别名用于为对象指定结构,确保其符合特定的形状;而索引签名则允许对象具有动态的属性名,并为这些属性指定统一的值类型。

2. 语法

let 对象名称 = { 属性名: 值, 
}

3. 参数说明

  • 对象名称(Name_of_object):这是对象的名称。
  • 属性名(object_property):这是对象的属性或键(Key)。
  • 值(value):这是该属性对应的值。

(二) 对象字面量表示法(Object Literal Notation)

在 TypeScript 中,对象字面量表示法是指使用花括号 {} 直接创建包含键值对的对象。这种方式可以通过显式定义对象属性及其类型来确保类型安全。

1. 示例

在这个示例中,我们定义了一个名为 person 的对象,它包含 firstNamelastNameage 属性。

const person = {firstName: "Felix",lastName: "Lu",age: 30,
};console.log(`Hello, ${person.firstName} ${person.lastName}!`);

输出:

Hello, Felix Lu!

在上述示例中,person 是一个具有 firstNamelastNameage 属性的对象。我们通过点号(dot notation)访问这些属性。

(三) 定义对象类型(Defining Object Types)

在 TypeScript 中,我们可以使用 接口(interface)类型别名(type alias) 来表示对象类型。这些类型模板可以确保对象遵循特定结构,从而增强类型安全性和代码可维护性。

1. 使用接口(Using Interfaces)

接口用于定义对象的结构,指定属性名称和类型,确保对象符合特定形状。

示例

在这个示例中,我们定义了一个接口 MyObject,并创建了一个对象 obj,它符合该接口,同时动态添加了一个 location 属性,并通过调用 solve 方法输出结果。

interface MyObject {company: string;type: string;solve: () => string;
}const obj: MyObject & { [key: string]: any } = {company: 'MozeTop',type: 'unique',solve: function (this: MyObject) {return `company is ${this.company}, and it's ${this.type}`;}
};// 调用 solve 方法
console.log(obj.solve());// 动态添加一个字段
obj.location = "BeiJing";// 打印新添加的字段
console.log(obj.location);

输出:

company is MozeTop, and it's unique
BeiJing

在上面的示例中,我们创建了一个接口 MyObject,并定义了一个常量 obj,它的类型是 MyObject 与一个可以动态添加属性的扩展类型。我们调用了对象中的方法,并输出了动态添加的字段。

2. 使用类型别名(Using Type Aliases)

类型别名用于为特定类型创建一个自定义名称,包括对象结构。它可以清晰地定义对象属性的类型和结构,确保对象具有一致性和类型安全。

示例

在这个示例中,我们定义了一个 Product 类型,并创建了一个符合该类型的对象 laptop,它包含 productIdnameprice 属性。

type Product = {productId: string;name: string;price: number;
};const laptop: Product = {productId: "No123",name: "iPhone 18",price: 8800,
};console.log(laptop);

输出:

{"productId": "No123","name": "Iphone 18","price": 8800
}

(四) 索引签名(Index Signatures)

TypeScript 中的索引签名允许对象具有动态的属性名,并为这些属性定义统一的值类型。这对于属性不固定的对象特别有用,可以实现灵活且类型安全的属性访问。

示例

在这个示例中,我们初始化了一个空的 nameAgeMap 对象,其键为字符串类型,值为数字类型。随后为 "Jack" 和 "Mark" 添加了年龄信息。

let nameAgeMap: { [index: string]: number } = {};
nameAgeMap["Jack"] = 25;
nameAgeMap["Mark"] = 30;
console.log(nameAgeMap);

输出:

{"Jack": 25,"Mark": 30
}

四、解释类型断言

在 TypeScript 中,类型断言允许开发者覆盖编译器推断出的类型,告知其某个值的具体类型。

类型断言完全是编译时的构造,不会改变代码的运行时行为。

在与 API 或返回值为 any 类型的第三方库交互时,它们特别有用。

let value: any = "This is a string";
let lengthOfString: number = (value as string).length;console.log(lengthOfString);
  • 声明了一个 value 变量,其类型为 any,意味着它可以保存任何类型的值。
  • 使用类型断言 (value as string),告知编译器该值应被视为字符串。
  • 然后可以安全地访问 length 属性,因为编译器将该值识别为字符串。

输出:

16

TypeScript 中类型断言的更多示例:

(一) 对函数返回值进行类型断言

function getValue(): any {return 'Hello, TypeScript!';
}let strLength: number = (getValue() as string).length;
console.log(strLength);
  • getValue 函数返回一个 any 类型的值。
  • 通过将返回值断言为字符串,可以安全地访问 length 属性。

输出:

18

(二) 对 DOM 元素进行类型断言

let element = document.querySelector('input[type="text"]');
let inputElement = element as HTMLInputElement;
console.log(inputElement.value);
  • document.querySelector 返回的是 Element 类型,该类型没有 value 属性。
  • 通过将 element 断言为 HTMLInputElement,告知 TypeScript 它是具体的元素类型,从而可以访问 value 属性。

输出:

[输入框的值]

(三) 对联合类型使用类型断言

type Pet = {name: string;walk: () => void;
};type Fish = {name: string;swim: () => void;
};let myPet: Pet | Fish = { name: 'Goldie', swim: () => console.log('Swimming') };(myPet as Fish).swim();
  • myPet 的类型是 Pet | Fish,意味着它可以是其中之一。
  • 通过将 myPet 断言为 Fish,告知编译器该对象具有 swim 方法,从而可以调用它。

输出:

Swimming

(四) TypeScript 中使用类型断言的最佳实践

  • 尽量少用类型断言: 尽可能依赖 TypeScript 的类型推断。过度使用类型断言可能掩盖潜在错误,降低代码可维护性。
  • 优先使用 as 语法: 使用 as 语法进行类型断言,以避免在 JSX 等环境中使用尖括号语法引发的冲突。
  • 避免断言为 any 将值断言为 any 会失去 TypeScript 静态类型检查的好处。应优先定义精确的类型以保持类型安全。

http://www.hkcw.cn/article/AFCKvunYwR.shtml

相关文章

【Java Web】速通Tomcat

参考笔记:JavaWeb 速通Tomcat_tomcat部署java项目-CSDN博客 目录 一、Tomcat服务 1. 下载和安装 2. 启动Tomcat服务 3. 启动Tomcat服务的注意事项 4. 关闭Tomcat服务 二、Tomcat的目录结构 1. bin 🌟 2. conf 🌟 3. lib 4. logs 5. temp 6. webapps 7. work 三、Web项目…

从零实现Python扫雷游戏:完整开发指南与深度解析

目录 一、游戏架构设计 1.1 核心组件 1.2 类结构设计 二、核心算法实现 2.1 地雷生成算法 2.2 数字计算算法 2.3 空白区域展开算法 三、图形界面开发 3.1 主界面布局 3.2 交互事件处理 左键点击事件 右键点击事件 3.3 游戏状态显示 四、游戏功能扩展 4.1 多难度…

hooks组件-useState

hooks组件-useState hook组件的本质就是函数组件&#xff0c;但是基于各种hook让其动态化&#xff01; 常用hook&#xff1a; useReducer&#xff1a;redux useCallback useMemo&#xff1a;去做一些优化。 useRef&#xff1a;使用ref useImperativeHandle&#xff1a;拿到子组…

X浏览器APP:轻巧快捷,畅享极速浏览

在移动互联网时代&#xff0c;浏览器作为我们获取信息、娱乐和社交的重要工具&#xff0c;其性能和功能直接影响着我们的使用体验。X浏览器APP正是这样一款专为移动设备设计的轻巧快捷的网络浏览器&#xff0c;它凭借独特的核心引擎和多项实用功能&#xff0c;为用户提供了极速…

一种基于性能建模的HADOOP配置调优策略

1.摘要 作为分布式系统基础架构的Hadoop为应用程序提供了一组稳定可靠的接口。该文作者提出了一种基于集成学习建模的Hadoop配置参数调优的方法。实验结果表明&#xff0c;该性能模型可以准确预测MapReduce应用程序的运行时间。采用提出的Hadoop配置参数方法调优后&#xff0c…

【001】利用github搭建静态网站_essay

文章目录 1. 简介2. 先了解网址规则2.1 文件及网址形式2.2 相互访问 3. 搭建网页的过程3.1 网页文件3.2 github搭建仓库及文件上传3.3 搭建网站 1. 简介 相信大家都有过想要自己搭建一个稳定可靠的网站&#xff0c;github是一个不错的选择&#xff0c;本来国内有gitee可以搭建…

太极APP:免Root,畅享Xposed模块的神奇魅力

在安卓系统中&#xff0c;Xposed框架一直以其强大的功能和高度的自定义能力受到众多用户的喜爱。然而&#xff0c;传统的Xposed框架需要Root权限和复杂的刷机操作&#xff0c;这使得许多普通用户望而却步。太极APP的出现&#xff0c;打破了这一限制&#xff0c;它为用户提供了一…

大学专业解读——电子信息

家里娃要高考了&#xff0c;面临专业和学校选择的问题。虽然我们家长做为职场人已经工作超过30年&#xff0c;但实际上对于专业和就业的问题&#xff0c;也不是太懂&#xff0c;网上有很多营销号在讲专业的志愿填报&#xff0c;但信息都比较碎片。所以&#xff0c;抽出一点时间…

实验一:PyTorch基本操作实验

import torch # PyTorch中初始化矩阵常见有以下几种方法 # 1. 直接使用固定值初始化 # M torch.tensor([[1.0, 2.0, 3.0]]) # 1x3矩阵 # 2. 随机初始化 # M torch.rand(1, 3) # 1x3矩阵&#xff0c;元素在0-1之间均匀分布 # M torch.randn(1, 3) # 1x3矩阵&#xff0c;元…

深入理解 C++ 中的 list 容器:从基础使用到模拟实现

一、list 的底层数据结构与核心特性 1.1 双向循环链表的物理结构 节点定义&#xff1a;每个节点包含三个部分 template <typename T> struct ListNode {T data; // 存储的数据ListNode* prev; // 指向前驱节点的指针ListNode* next; // 指向后继节点的指针L…

【iOS】YYModel源码解析

YYModel源码解析 文章目录 YYModel源码解析前言YYModel性能优势YYModel简介YYClassInfo解析YYClassIvarInfo && objc_ivarYYClassMethodInfo && objc_methodYYClassPropertyInfo && property_tYYClassInfo && objc_class YYClassInfo的初始化细…

nssctf第二题[SWPUCTF 2021 新生赛]简简单单的逻辑

这是题目&#xff0c;下载后得到一个python文件,打开 解读代码&#xff1a; for i in range(len(list)):key (list[i]>>4)((list[i] & 0xf)<<4)result str(hex(ord(flag[i])^key))[2:].zfill(2)list[i]>>4&#xff1a;从列表中取数字同时高4位向右位…

linux驱动 - 5: simple usb device驱动

参考第2节, 准备好编译环境并实现hello.ko: linux驱动 - 2: helloworld.ko_linux 驱动开发 hello world ko-CSDN博客 下面在hello模块的基础上, 添加代码, 实现一个usb设备驱动的最小骨架. #include <linux/init.h> #include <linux/module.h> #include <lin…

某电子计数跳绳的一次修复经历

引子 这阵子开始锻炼身体&#xff0c;感觉投入成本低的&#xff0c;就是跳绳了&#xff0c;所以从20块钱的竹节跳起&#xff0c;随着100、1000、2000、3000个数的加码&#xff0c;还是需要一个电子计数会更好些&#xff0c;不用心中默数了。 这样在某宝上购入一个电子自动计数&…

【设计模式-3.5】结构型——装饰器模式

说明&#xff1a;本文介绍结构型设计模式之一的装饰器模式 定义 装饰器模式&#xff08;Decorator Pattern&#xff09;也叫作包装器模式&#xff08;Wrapper Pattern&#xff09;&#xff0c;指再不改变原有对象的基础上&#xff0c;动态地给一个对象添加一些额外的职责。就…

交换机、路由器配置

四、交换机配置 1、以太网MAC地址 以太网地址用来识别一个以太网上的某个单独的设备或一组设备。 2、Ethernet II帧格式 3、交换机工作原理 初始状态 MAC地址学习&#xff08;源MAC&#xff09; 广播未知数据帧 接收方回应&#xff0c;交换机再次学习MAC地址 交换机实现单播…

业务系统-AI 智能导航设计-系统设计篇(上)

引言 在数字化转型加速推进的当下&#xff0c;企业业务系统正朝着复杂化、集成化方向快速发展。据 Gartner 调研数据显示&#xff0c;超过 68% 的企业业务系统因功能模块激增导致员工平均操作失误率上升 23%&#xff0c;传统菜单式导航与标准化培训模式已难以应对 "功能爆…

如何把电脑桌面设置在D盘?

一、桌面路径默认设置在C盘的问题 桌面路径默认设置在C盘的问题&#xff1a;如果你习惯于将重要文件存放在桌面上&#xff0c;那么在系统崩溃时&#xff0c;这些文件可能会遭受损失&#xff0c;因为只有重装系统才能解决问题。为了避免这种情况&#xff0c;你可以考虑将桌面路…

Mysql水平分表(基于Mycat)及常用分片规则

参考资料: 参考视频 参考博客 视频资料:链接: https://pan.baidu.com/s/1xT_WokN_xlRv0h06b6F3yg 提取码: aag3 Mysql分库分表(基于Mycat)的基本部署 MySQL垂直分库(基于MyCat) 概述: 本例是在垂直分库的基础上,又作的水平分库,参照前文也可以单独拿出来做水平分…

「Java教案」算术运算符与表达式

课程目标 1&#xff0e;知识目标 能够区分Java运算符的种类&#xff0c;例如&#xff0c;算术、赋值、关系、逻辑、位运算等。能够区分Java各类运算符的功能和使用场景。能够根据表达式的构成和计算规则&#xff0c;写出正确的表达式。能够根据运算符优先级与结合性&#xff…