TypeScript 常用类型

文章目录

    • 1. 类型注解
    • 2. 原始类型
    • 3. 数组类型
    • 4. 联合类型
    • 5. 类型别名
    • 6. 函数类型
    • 7. 对象类型
    • 8. 接口类型
      • 8.1 接口声明
      • 8.2 接口继承
    • 9. 元组类型
    • 10. 类型断言
    • 11. 字面量类型
    • 12. 枚举类型
      • 12.1 数字枚举
      • 12.2 字符串枚举
    • 13. any 类型
    • 14. typeof 运算符

1. 类型注解

前言:
① TS 是 JS 的超集,它提供了 JS 的所有功能,并且额外的增加了类型系统;
② 所有的 JS 代码都是 TS 代码;
③ JS也有类型(比如,number、string 等),但是 JS 不会检查变量的类型是否发生改变,而 TS 会检查;
④ TS 类型系统的主要优势:可以显示标记处代码中的意外行为,从而降低了发生错误的可能性。

//: number 就是类型注解
let age: number = 2

2. 原始类型

let age: number = 2
let name: string = '栈老师'
let isLoading: boolean = false
let a: null = null
let b: undefined = undefined
let s: symbol = Symbol()

3. 数组类型

//数组类型的两种写法(推荐使用第一种)
let numbers: number[] = [1, 3, 5]
let strings: Array<string> = ['a', 'b', 'c']

4. 联合类型

需求:数组中既有 number 类型,又有 string 类型。

//数组中既有 number 类型,又有 string 类型。
let arr: (number | string)[] = [1, 2, '栈老师']
//不添加小括号表示,既可以是number类型,又可以是string[]类型
let arr: number | string[] = ['栈老师']

5. 类型别名

场景:当同一类型被多次使用时,可以通过类型别名,来简化该类型的使用。

//通过type关键字声明类型别名
type CustomArray = (number | string)[]
let arr1: CustomArray = [1, 2, '栈老师']

创建自定义的类型别名后,直接使用该类型别名作为变量的类型注解即可!

6. 函数类型

//返回值为number类型 
function add(num1: number, num2: number): number {
    return num1 + num2
}
//没有返回值用void
function greet(name: string): void {
    console.log(name)
}

//参数可传可不传,加问号
function myTest(name: string, age?: number): void {
    console.log(name, age)
}

函数声明方式声明函数:

在这里插入图片描述

函数表达式方式声明函数:

在这里插入图片描述

可选参数,在可传可不传的参数后面加 ?(问号),注意可选参数只能放在参数列表的最后,必选参数应该放在最前面。

7. 对象类型

let person: {name: string; age: number; sayHi(): void} = {
    name: '栈老师',
    age: 24,
    sayHi() {}
}

用花括号描述对象结构,在一行代码中指定多个属性类型时,使用分号来隔开,对象可选属性的语法与函数可选参数的语法一致,直接在可选属性的后面加问号即可!

8. 接口类型

8.1 接口声明

当一个对象类型被多次使用时,一般会使用接口来描述对象的类型,达到复用的目的。

//使用interface指定别名
interface IPerson {
    name: string;
    age: number;
    sayHi(): void
}

//使用type指定别名
type IPerson = {
    name: string;
    age: number;
    sayHi(): void
}

let person: IPerson = {
    name: '栈老师',
    age: 24,
    sayHi() {}
}

注意点:
① 使用 interface 关键字来声明接口;
② 直接使用接口名称作为变量的类型;
③ 也可以使用 type 来指定别名,只不过 interface 只能为对象类型指定别名,并且可以继承,而 type 可以为任意类型指定别名,但不能继承。

8.2 接口继承

如果两个接口之间有相同的属性或方法,可以将公共的属性或方法抽离出来,通过继承来实现复用。

//继承后,Point3D就有了Point2D的属性和方法
interface Point2D {x: number; y: number}
interface Point3D extends Point2D {z: number}

9. 元组类型

let position: [number, number] = [25, 71]

元组类型可以确切地标记出有多少个元素,以及每个元素的类型!

10. 类型断言

const aLink = document.getElementById('link') as HTMLAnchorElement

① 使用 as 关键字实现类型断言;
② 关键字 as 后面的类型是一个更加具体的类型;
③ 通过类型断言,aLink 的类型变得更加具体,这样就可以访问 a 标签特有的属性或方法了。

11. 字面量类型

let str1 = 'hello'
const str2 = 'hello'

通过 TS 类型推论机制,可以得到答案:str1 的类型为 string,str2 的类型为 hello。

注意点:
① str1 是一个变量(let),它的值可以是任意字符串,所以类型为 string;
② str2 是一个常量(const),它的值不能变化只能是 hello,所以它的类型为 hello。

此处的 hello 就是一个字面量类型,也就是说某个特定的字符串也可以作为 TS 中的类型!

使用场景:字面量类型可以配合联合类型一起使用,用来表示一组明确的可选值列表。

//direction的类型只能是up或down
function changeDirection(direction: 'up' | 'down') {
    console.log(direction)
}

相比于 string 类型,使用字面量类型更加精确、严谨!

12. 枚举类型

枚举:定义一组命名常量,类似字面量类型加联合类型的组合,它描述一个值,该值可以是这些命名常量中的一个。

enum Direction {Up, Down}
function changeDirection(direction: Direction) {
    console.log(direction)
}
changeDirection(Direction.Up)

注意点:
① 约定枚举名称、枚举中的值都以大写字母开头;
② 枚举中的多个值之间通过逗号分隔;
③ 定义好枚举后,直接使用枚举名称作为类型注解;
④ 类似 JS 中的对象,通过 Direction.Up 来访问枚举中的成员。

12.1 数字枚举

枚举成员也是有值的,默认从 0 开始自增,Direction.Up 的值为 0。当然也可以给枚举中的成员初始化值:

enum Direction {Up = 10, Down = 2} 

12.2 字符串枚举

字符串枚举没有自增长行为,因此,字符串枚举的每个成员必须有初始值。

enum Direction {Up =UP, Down = 'Down'} 

其他类型仅仅被当做类型,而枚举不仅用作类型,还提供值,也就是说,其他的类型在编译为 JS 代码时会自动移除,但枚举类型会被编译为 JS 代码!

一般情况下,推荐使用字面量类型 + 联合类型组合的方式,因为相比枚举,这种方式更加直观、简洁和高效!

13. any 类型

当值的类型为 any 时,可以对该值进行任意操作,并且不会有代码提示。

let obj: any = {x: 0}

即使存在错误也不会给出提示,所以不推荐使用 any 类型!

14. typeof 运算符

typeof 不仅可以获取数据类型,还可以在类型上下文中引用变量或属性的类型,以此来简化书写。

let p = {x: 1, y: 2}
function formatPoint(point: typeof p) {}
formatPoint(p)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947418.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARM200~500部署

前提&#xff1a;数据库已经安装好&#xff0c;并且正常运行 1.修改hostname,将里面的AR-A 改为hzx vi /etc/hostname 2.重启网络服务 sudo systemctl restart NetworkManager 3.修改community-admin.service 文件&#xff0c;更改小区名称和IP&#xff0c;并将文件上传到/…

Linux buildroot和ubuntu的异同点

Buildroot 和 Ubuntu 都是 Linux 系统的操作环境,但它们的设计理念和使用场景有很大的不同。 一、定义与目标 Buildroot Buildroot 是一个用于生成嵌入式 Linux 系统的工具集,专注于交叉编译和构建嵌入式设备的最小 Linux 环境。它的目标是为嵌入式系统提供定制化和优化的…

从0开始的opencv之旅(1)cv::Mat的使用

目录 Mat 存储方法 创建一个指定像素方式的图像。 尽管我们完全可以把cv::Mat当作一个黑盒&#xff0c;但是笔者的建议是仍然要深入理解和学习cv::Mat自身的构造逻辑和存储原理&#xff0c;这样在查找问题&#xff0c;或者是遇到一些奇奇怪怪的图像显示问题的时候能够快速的想…

免登录游客卡密发放系统PHP网站源码

源码介绍&#xff1a; 这是一个简单易用的卡密验证系统&#xff0c;主要功能包括&#xff1a; 卡密管理和验证&#xff0c;多模板支持&#xff0c;响应式设计&#xff0c;验证码保护&#xff0c;防刷机制&#xff0c;简洁的用户界面&#xff0c; 支持自定义模板&#xff0c;移…

LeetCode - 初级算法 数组(旋转数组)

旋转数组 这篇文章讨论如何通过编程实现数组元素的旋转操作。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例: 输入: nums = [1,2,3,

BOC调制信号matlab性能仿真分析,对比功率谱,自相关性以及抗干扰性

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

【从零开始入门unity游戏开发之——C#篇41】C#迭代器(Iterator)——自定义类实现 foreach 操作

文章目录 前言一、什么是迭代器&#xff1f;二、标准迭代器的实现方法1、自定义一个类CustomList2、让CustomList继承IEnumerable接口3、再继承IEnumerator接口4、完善迭代器功能5、**foreach遍历的本质**&#xff1a;6、在Reset方法里把光标复原 三、用yield return语法糖实现…

WordPress新安装只安装主题后发现只有首页能打开,其他路由页面都是404,并且Elementor都打不开

找到wordpress安装路径的这个文件&#xff0c;有发现里面没有内容&#xff0c;添加下面内容保存&#xff0c;重启服务器即可 # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ – [L] RewriteCond %{REQUEST_FILEN…

uniapp中使用ruoyiPlus中的加密使用(crypto-js)

package.json中添加 "crypto-js": "^4.2.0", "jsencrypt": "^3.3.2",但是vue2中使用 import CryptoJS from cryptojs; 这一步就会报错 参照 参照这里&#xff1a;vue2使用CryptoJS实现信息加解密 根目录下的js文档中新增一个AESwork.…

无需训练!多提示视频生成最新SOTA!港中文腾讯等发布DiTCtrl:基于MM-DiT架构

文章链接&#xff1a;https://arxiv.org/pdf/2412.18597 项目链接&#xff1a;https://github.com/TencentARC/DiTCtrl 亮点直击 DiTCtrl&#xff0c;这是一种基于MM-DiT架构的、首次无需调优的多提示视频生成方法。本文的方法结合了新颖的KV共享机制和隐混合策略&#xff0c;使…

RabbitMQ基础篇之快速入门

文章目录 一、目标需求二、RabbitMQ 控制台操作步骤1.创建队列2.交换机概述3.向交换机发送消息4.结果分析5.消息丢失原因 三、绑定交换机与队列四、测试消息发送五、消息查看六、结论 一、目标需求 新建队列&#xff1a;创建 hello.queue1 和 hello.queue2 两个队列。消息发送…

ESP32S3 + IDF 5.2.2 扫描WiFi

ESP32S3 IDF 5.2.2 扫描WiFi 目录 1 资料 2 通过Wi-Fi库扫描附近的网络 2.1 通过idf命令创建工程 2.2 编写测试用例 2.3 优化测试用例 3 小结 1 资料 在ESP平台基于IDF开发WiFi相关功能&#xff0c;主要就是基于IDF的Wi-Fi库进行二次开发。可供参考的官方资料&#xff…

2025-1-2-sklearn学习(30)模型选择与评估-验证曲线: 绘制分数以评估模型 真珠帘卷玉楼空,天淡银河垂地。

文章目录 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型30.1. 验证曲线30.2. 学习曲线 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型 文章参考网站&#xff1a; https://sklearn.apachecn.org/ 和 https://scikit-learn.org/stable/ 每种估…

统信系统设置代理的问题

统信系统设置代理的问题 问题表现方式一方式二 问题表现 统信系统下有系统代理和应用代理两个代理。设置系统代理时&#xff0c;git不能经过代理拉取代码。但是设置应用代理时&#xff0c;可以用git通过代理拉代码。 这是系统代理&#xff0c;在这里设置 ip 端口&#xff0c;…

STM32-笔记19-串口打印功能

复制项目文件夹03-流水灯&#xff0c;重命名为19-串口打印功能 打开项目 在主函数中&#xff0c;添加头文件、和串口初始化函数&#xff08;设置波特率&#xff09;和输出函数&#xff0c;如图所示&#xff1a; 软件部分就设置好了 下面是硬件部分 接线&#xff1a;使用USB…

JavaWeb——MySQL-DML(1/3)-添加数据insert(DML 操作概述、INSERT 语句插入数据、语句演示、总结)

目录 DML 操作概述 INSERT 语句插入数据 INSERT 语句基础语法 INSERT 语句演示 注意事项 总结 DML 操作概述 DML 简介 DML&#xff08;Data Manipulation Language&#xff09;即数据操作语言&#xff0c;用于对数据库表中的数据进行增删改操作&#xff0c;包括添加数据&…

Docker图形化界面工具Portainer最佳实践

前言 安装Portainer 实践-基于Portainer安装redis-sentinel部署 Spring Boot集成Redis Sentinel 前言 本篇文章笔者推荐一个笔者最常用的docker图形化管理工具——Portainer。 安装Portainer 编写docker-compose文件 Portainer部署的步骤比较简单&#xff0c;我们还是以…

Wonder Dynamics技术浅析(五):虚拟场景描述解析

虚拟场景描述解析模块是 Wonder Dynamics 平台的核心组件之一&#xff0c;其主要功能是将用户输入的自然语言场景描述转换为机器可理解的语义表示&#xff0c;为后续的虚拟场景生成提供基础数据。 一、文本预处理&#xff08;Text Preprocessing&#xff09; 1. 目标: 对用户…

基于SpringBoot在线竞拍平台系统功能实现十一

## 一、前言介绍&#xff1a;1.1 项目摘要 随着网络技术的飞速发展和电子商务的普及&#xff0c;竞拍系统作为一种新型的在线交易方式&#xff0c;已经逐渐深入到人们的日常生活中。传统的拍卖活动需要耗费大量的人力、物力和时间&#xff0c;从组织拍卖、宣传、报名、竞拍到成…

JavaScript基础 -- 变量、作用域与内存

1 原始值与引用值 原始值就是最简单的数据&#xff0c;引用值则是由多个值构成的对象。在把一个值赋给变量时&#xff0c;JavaScript引擎必须要确定这个值是原始值还是引用值 原始值大小固定&#xff0c;保存在栈内存上&#xff1b;引用值是对象&#xff0c;存储在堆内存上 它…