TypeScript系列:初篇 - 类型系统

TypeScript 是 JavaScript 的一个超集,添加了类型系统和编译期错误检查等功能 => 静态类型检查。

类型指的是一组具有相同特征的值。

静态类型系统描述了运行程序时的值的形状和行为。

TypeScript 支持块级类型声明,即类型可以声明在代码块(用大括号表示)里面,只在当前代码块有效。

动态类型 pk 静态类型

JavaScript 动态类型语言,没有使用限制。

let test = 'ligang'
test = 33

TypeScript 静态类型语言,引入了类型系统。

let test: string = 'ligang' 
test = 33	// 不能将类型“number”分配给类型“string”
特性JavaScriptTypeScript
类型系统动态类型静态类型
编译解释执行,无需编译需要编译成 JavaScript
工具支持广泛支持,无需额外配置需要配置 TypeScript 编译器和类型定义
错误检测运行时错误检测编译时错误检测
代码维护较难维护大型项目易于维护大型项目
学习曲线简单,易于上手需要额外学习类型系统
库和框架几乎所有库和框架都支持需要类型定义文件(或自行定义)
性能无额外开销编译过程可能引入微小延迟
兼容性无需转换,直接运行需要编译成 JavaScript 才能运行
社区和生态系统非常成熟和广泛正在快速发展,但不如 JavaScript 成熟
开发体验快速开发和迭代提供更好的开发体验,如智能提示和重构工具
未来兼容性随着 ECMAScript 的更新而更新需要更新 TypeScript 以支持新特性

💡 TypeScript 本身不执行任何代码,只是添加了一个类型系统,用于在编译时提供类型安全和错误检查。TypeScript 的代码最终需要被编译成 JavaScript,然后由 JavaScript 引擎执行

类型声明

在标识符后面添加“冒号 + 类型”。

let test: string = 'ligang' function toString(num: number): string {return String(num);
}

类型声明并不是必需的,如果没有,TypeScript 会自行推断类型。

由于这个原因:所有 JavaScript 代码都是合法的 TypeScript 代码。这样设计还有一个好处,将以前的 JavaScript 项目改为 TypeScript 项目时,可以逐步地为老代码添加类型。1

基本类型

TypeScript 继承了 JavaScript 的类型设计:boolean、string、number、bigint、symbol、object、undefined、null

值类型

单个值的情况,称为“值类型”。

let myName: 'ligang';myName = 'ligang';
myName = '李刚';  		// 不能将类型“"李刚"”分配给类型“"ligang"”。

上述示例,myName 的类型是字符串 ligang。后续只能赋值为 ligang,赋值为其他字符串就会报错。

使用 let/const 声明的变量,如果没有注明类型,就会推断该变量是值类型。

let myName = 'ligang';
myName = true;		// 不能将类型“boolean”分配给类型“string”

⚠️ 如果赋值为对象,会推断既有属性。

const a = { b: 1 };
a.b = '1'; // 不能将类型“string”分配给类型“number”。

any|never|unkown

说明
any表示没有任何限制,可以赋予任意类型的值
unkown表示任何值,可以赋值为各种类型的值;只有明确unknown变量的实际类型,才允许使用它
never表示空,不包含任何值,可以赋值给任意其他类型

any 类型

只有为了适配老的 JavaScript 项目,让代码快速迁移到 Typescript, 可以把变量设置为 any,其他场景应该尽量避免使用 any 类型。

unkown 类型

所有类型的值都可以分配给 unknown 类型;但只有明确 unknown 变量的实际类型,才允许使用它。

let a: unknown = 1;r1 = a + 10; 		// “a”的类型为“未知”if (typeof a === 'number') {r2 = a + 10; 	// 正确
}

never 类型

使用 never 类型来表示不应该存在的状态。

function getArea(shape: Shape) {switch (shape.kind) {...default: {const _exhaustiveCheck: never = shape;return _exhaustiveCheck;}}
}

在新追加类型时,会凸显其作用:在开发阶段就提前警示可能的错误。

type Shape = Circle | Square | { kind: 'triangle'; sideLength: number };function getAre(shape: Shape) {...default: {const _exhaustiveCheck: never = shape;  // 不能将类型“{ kind: "triangle"; sideLength: number; }”分配给类型“never”return _exhaustiveCheck;}
}

💯 TypeScript 有两个“顶层类型”(anyunknown),但是“底层类型”只有 never

  • 顶层类型:包含了一切可能的类型;所有其他类型的全集。
  • 底层类型:任何类型都包含的类型;空集是任何集合的子集。

联合类型

多个类型组成的一个新类型,使用符号 | 表示。 表示一个值可以是几种类型之一!

let myName: 'ligang' | '李刚';
interface ViolationItem {violationCode: string | null;violationName?: string;
}

如果一个变量有多种类型,读取该变量时,往往需要进行==“类型缩小”==2,区分该值到底属于哪一种类型,然后再进一步处理。

“类型缩小”是 TypeScript 处理联合类型的标准方法,凡是遇到可能为多种类型的场合,都需要先缩小类型,再进行处理!

function getViolationCode (data: ViolationItem) {if (typeof data.violationCode === "string") {return data.violationCode.toLowerCase()} else {return data.violationCode}
}

交叉类型

多个类型组成的一个新类型,使用符号 & 表示。表示一个值同时具有所有这些类型的属性!

A & B 同时满足 AB。交叉类型常常用来为对象类型添加新属性

interface Person {name: string;
}type PersonType = Person & { age: number };

PersonType 是交叉类型,在 Person 基础上追加了属性 age

type 用来定义一个类型的别名「下篇博文详细介绍」。

🍒 interface 扩展常用 extends 实现!type 的扩展使用交叉类 &


  1. https://typescript.p6p.net/typescript-tutorial/basic.html ↩︎

  2. https://nodejs.cn/typescript/handbook/narrowing ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL数据库——MYSQL管理

MYSQL数据库安装完成后,自带四个数据库,具体作用如下: 常用工具 1.mysql 不是指mysql服务,而是指mysql的客户端工具 例如: 2.mysqladmin 这是一个执行管理操作的客户端程序,可以用它来检查服务器的配置和…

多线程篇六

多线程篇六 如笔者理解有误欢迎交流指正~⭐ 什么是单例模式? 单例模式是最常见的 设计模式. 顾名思义,单例模式指的就是单个实例的模式.(针对某些类只能使用一个对象的场景【如MySQL、JDBC、DataSource】) 设计模式 设计模式是…

数据结构之二叉树(1)

数据结构之二叉树(1) 一、树 1、树的概念与结构 (1)树是一种非线性的数据结构,由n(n>0)个有限结点组成一个具有层次关系的集合。 (2)树有一个特殊的结点,叫做根结点&#xff…

Linux:Bash中的文件描述符

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程,都拥有自己的文件描述符(File Descriptor, FD),它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

能否通过 cuda 安装cudatoolkit 以及通过 pip 安装 torch 呢?

能否通过 cuda 安装cudatoolkit 以及通过 pip 安装 torch 呢? 如题目所述, 本人新建了一个c onda 虚拟环境. 这个虚拟环境中使用 pip 命令安装了 torch 等一系列库, 然后在安装 mvcc 时遇到了… 文章没有写完, 因为我突然发现我的 mvcc 安装成功了, 然后我就没有往下深究

UAC2.0 麦克风——多采样率支持

UAC2.0 麦克风系列文章 UAC2.0 麦克风——单声道 USB 麦克风(16bit) UAC2.0 麦克风——类特殊请求 UAC2.0 麦克风——音量控制 UAC2.0 麦克风——多采样率支持 UAC2.0 麦克风——24/32bit 支持 UAC2.0 麦克风——麦克风数据传输 UAC2.0 麦克风——同时支持 16bit,24bit 和 …

【Mac】系统环境配置

常用工具 Navicat PJ版本:this 提取密码:v31p Host切换器 SwitchHosts termius 一款好用的Linux服务器连接工具: termius 小飞机 dddd:🪜 Git mac安装git有好多种方式,自带的xcode或者通过Homebr…

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):802 标注数量(xml文件个数):802 标注数量(txt文件个数):802 标注类别…

pytorch快速入门(一)—— 基本工具及平台介绍

前言 该pytorch学习笔记应该配合b站小土堆的《pytorch深度学习快速入门教程》使用 环境配置:Anaconda Python编译器:pycharm、jupyter 两大法宝函数 dir():知道包中有什么东西(函数 / 属性..…

C++的封装

手动封装一个顺序表(SeqList),分文件编译实现 有私有成员:顺序表数组的起始地址 ptr、 顺序表的总长度:size、顺序表的实际长度:len 成员函数:初始化 init(int n) 判空:empty 判满:f…

【计算机网络 - 基础问题】每日 3 题(一)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

云手机的便捷性和安全性体现在哪?

随着5G技术的迅速发展,云手机在游戏、电商以及新媒体营销等领域中的应用日益广泛。它不仅能够显著降低成本、提升效率,还随着边缘计算和云技术的进步,展现出无限的增长潜力。 云手机的便捷性体现在哪里? 云手机的便捷性毋庸置疑。…

Python Flask网页开发基本框架

注:Flask详细学习请见Flask学习合集。 直接上代码: app.py from flask import Flaskapp Flask(__name__)app.route("/") def hello():return "Hello, World!"if __name__ "__init__":app.run(host "127.0.0.1", port…

基于ExtendSim的 电子制造 仿真模型

说明: 此模型表示电路板制造设施。该过程有4个步骤: *焊料制备 *组件放置 *烤箱 *检查 详情: *烤箱的容量为10张卡,但如果烤箱循环开始时仅能处理5张卡,则最多只能处理5张。 *如果检查员发现问题,他们将修理…

精密运放与普通运放的区别

精密运放和普通运放之间的区别主要体现在性能、设计、应用场合以及关键参数上。以下是对这些区别的详细阐述: 一、性能差异 放大倍数与精度: 精密运放:具有更高的开环放大倍数,能够更精确地放大信号。其失调电压或失调电流非常小…

大数据新视界 --大数据大厂之 Cassandra 分布式数据库:高可用数据存储的新选择

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【matlab】将程序打包为exe文件(matlab r2023a为例)

文章目录 一、安装运行时环境1.1 安装1.2 简介 二、打包三、打包文件为什么很大 一、安装运行时环境 使用 Application Compiler 来将程序打包为exe,相当于你使用C编译器把C语言编译成可执行程序。 在matlab菜单栏–App下面可以看到Application Compiler。 或者在…

数据结构和算法之线性结构

原文出处:数据结构和算法之线性结构 关注码农爱刷题,看更多技术文章!!! 线性结构是一种逻辑结构,是我们编程开发工作应用最广泛的数据结构之一。线性结构是包含n个相同性质数据元素的有限序列。它的基本特征是&…

docker入门安装及使用

docker概述 docker是一种容器技术,它提供了标准的应用镜像(包含应用和应用多需要的依赖),因此,我们可以非常轻松的在docker中安装应用,安装好的应用相当于一个独立的容器 如下图所示,为docker中…

如何将Git本地代码推送到Gitee云端仓库

如何将Git本地代码推送到Gitee云端仓库 在使用Git进行版本控制时,将本地代码推送到远程仓库是一个基本且重要的操作。本文将详细介绍如何将你的Git本地代码推送到Gitee(码云)云端仓库。Gitee是一个国内非常流行的代码托管平台,类…