《TypeScript》系列之对比JavaScript,TypeScript的优势
概述
TypeScript是微软公司开发的一种基于JavaScript语言的编程语言,它的目的并不是创造一种全新的语言,而是增强JavaScript的功能,使其更适合多人合作的企业级项目。TypeScript可以看做是JavaScript的超集,即它继承了后者的全部语法,所有的JavaScript脚本都可以当做TypeScript脚本(有可能报错),此外它再增加了一些自己的语法。TypeScript对JavaScript添加的最主要部分,就是一个独立的类型系统。
类型的概念
类型指的是一组具有相同特征的值,如果两个值具有某种共同的特征,就可以说,它们属于同一种类型。
举例来说,123和456这两个值,共同特征就是都能进行数值运算,所以都属于“数值”(number)类型。
可以这样理解,类型是认为添加的一种编程约束和用法提示。主要目的是在软件开发过程中,为编译器和开发工具提供更多的验证和帮助
下面是一段简单的 TypeScript 代码,演示一下类型系统的作用。
function addOne(n:number) {return n + 1;
}
上面示例中,函数addOne()
有一个参数n
,类型为数值(number),表示这个位置只能使用数值,传入其他类型的值就会报错。
addOne('hello') // 报错
上面示例中,函数addOne()
传入了一个字符串hello
,TypeScript 发现类型不对,就报错了,指出这个位置只能传入数值,不能传入字符串。
JavaScript语言就没有这个功能,不会检查类型对不对。开发阶段很可能发现不了这个问题,代码也许就会原样发布,导致用户在使用时遇到错误。
作为比较,TypeScript是在开发阶段报错,这样有利于提早发现错误,避免使用时报错,另一方面,函数定义里面加入类型,具有提示作用,可以告诉开发者这个函数怎么用。
动态类型和静态类型
前面说了,TypeScript 的主要功能是为 JavaScript 添加类型系统。大家可能知道,JavaScript 语言本身就有一套自己的类型系统,比如数值123
和字符串Hello
。
但是,JavaScript 的类型系统非常弱,而且没有使用限制,运算符可以接受各种类型的值。在语法上,JavaScript 属于动态类型语言。
请看下面的 JavaScript 代码。
// 例一
let x = 1;
x = 'hello';// 例二
let y = { foo: 1 };
delete y.foo;
y.bar = 2;
上面的例一,变量x声明时,值的类型是数值,但是后面可以改成字符串。所以,无法提前知道变量的类型是什么,也就是说,变量的类型是动态的。
上面的例二,变量y是一个对象,有一个属性foo,但是这个属性是可以删除掉,并且还可以新增其他属性。所以,对象有什么属性,这个属性还在不在,也是动态,没法提前知道。
正式因为存在这些动态变化,所以JavaScript的类型系统是动态,不具有很强的约束。这对于提前发现代码错误,非常不利。
TypeScript引入了一个更强大、更严格的类型系统,属于静态类型语言。
上面的代码在TypeScript里面都会报错。
// 例一
let x = 1;
x = 'hello';// 例二
let y = { foo: 1 };
delete y.foo;
y.bar = 2;
上面实例中,例一的报错是因为变量赋值时,TypeScript以及推断确定了类型,后面就不允许再赋值为其他类型的值。即变量的类型是静态。例二的报错时因为对象的属性也是静态的,不允许随意增删。
TypeScript的作用,就是为JavaScript引入这种静态类型特征。
静态类型的优点
静态类型的很多好处,这也就是TypeScript想要达到的目的。
1)有利于代码的静态分析
有了静态类型,不必要运行代码,就可以确定变量的类型,从而推断代码有么有错误,这个就较多代码的静态分析。
这对于大型项目非常重要,单单在开发阶段运行静态检查,就可以发现很多问题,避免交付有问题的代码,大大降低了线上风险。
2)有利于发现错误
由于每个值、每个变量、每个运算符都有严格的类型约束,TypeScript就能轻松发现拼写错误、语义错误和方法调用错误,节省程序员的时间。
let obj = { message: '' };
console.log(obj.messege); // 报错
上面实例中,不小心把message拼错了,写成message。TypeScript就会报错,指出没有定义过这个属性。JavaScript遇到这种情况是不报错的。
const a = 0;
const b = true;
const result = a + b; // 报错
上面的实时合法的JavaScript代码,但是没有意义,不应该将数值a与布尔值b相加。TypeScript就会直接报错,提示运算符+不能用于数值和布尔值的相加。
function hello() {return 'hello world';
}hello().find('hello'); // 报错
上面实例中,hello()返回的是一个字符串,TypeScript发现字符串没有find()方法, 所以就报错了。如果是JavaScrip,只有到运行阶段才会报错。
3)更好的IDE支持,做到语法提示和自动补全
4)提供了代码文档
5)有助于代码重构
静态类型的缺点
1)丧失了动态类型代码的灵活性
2)增加了变成工作量
- 有了类型之后,程序员不仅需要编写功能,还需要编写类型声明,确保类型正确。这增加了不少工作量,又是会显著做场项目的开发时间
3)更高的学习成本
- 类型系统通常比较复杂,要学习更多东西,要求开发者付出更高的学习成本
4)引入了独立的编译步骤
- 原生的JavaScript代码,可以直接在JavaScript引起运行,添加类型系统之后,就多出了一个单独编译步骤,检查类型是否正确,并将TypeScript代码转成 JavaScript代码,这样才能运行。
5)兼容性问题
- TypeScript依赖JavaScript生态,需要用到很多外部模块。但是,过去大部分 JavaScript 项目都没有做 TypeScript 适配,虽然可以自己动手做适配,不过使用时难免还是会有一些兼容性问题。
相关文章:
《TypeScript》系列之对比JavaScript,TypeScript的优势
概述 TypeScript是微软公司开发的一种基于JavaScript语言的编程语言,它的目的并不是创造一种全新的语言,而是增强JavaScript的功能,使其更适合多人合作的企业级项目。TypeScript可以看做是JavaScript的超集,即它继承了后者的全部…...
Notepad++使用技巧
显示远程连接的文件目录 自动完成:函数自动提示 自动输入:输入一半括号自动补全另一半 自动关联 .pc文件识别为C 列模式 按住Alt不松手,可以直接范围选择,便于编辑选择的区域 关键行筛选 1.进入搜索页面的标记 2.选中标…...
React 中报Type error: Could not find a declaration file for module ‘qs‘.(已解决)
ts项目引入qs 比如 nextjs 或者reactjs npm install --save-dev types/qs 确保你的tsconfig.json文件中有以下设置 {"compilerOptions": {"types": ["qs"]}} 如果你的项目中没有tsconfig.json文件,你可以创建一个。在项目根目录下创…...
【Linux】:Linux环境与版本
以下哪个命令输出Linux内核的版本信息 A.uname -r B.vmstat C.sar D.stat uname -r 查看linux内核版本信息 vmstat 报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息 sar 主要帮助我们掌握系统资源的使用情况,特别是内存和CPU的使用情况 stat 用于显示…...
PNG转EPS,包括Latex导入
在电脑TEXLIVE文件夹里中找到bmeps.exe TEXLIVE\2022\bin\win32 可以新建一个文件夹picture(图片和exe文件必须在一个文件夹里),将bmeps.exe复制出来,方便后续大量图片操作 导入png图片 新建一个txt文件,命名为Fig1.…...
Visual Studio 2022 cmake编译 PP-OCRv4
1 环境准备 下载PaddleOCR PaddleOCR C 部署代码位于 PaddleOCR\deploy\cpp_infer目录下 paddle_inference paddle_inference opencv 这里使用已经安装好的opencv4.5.5下载dirent-master.zip 下载dirent-master.zip, 解压并复制dirent.h文件到PaddleOCR\deploy\cpp_infer目录下…...
学习笔记|串口与PC通信的接线|移植驱动程序|串口通信实战|STC32G单片机视频开发教程(冲哥)|第二十一集(上):串口与PC通信
目录 1.串口与PC通信的接线芯片与芯片之间的通讯:芯片与电脑之间的通讯: 2.利用实验箱示例代码移植驱动程序3.串口通信实战最小工程代码移植编译提示错误:undefined identifier 1.串口与PC通信的接线 上节试验是串口和电脑进行一个通信&…...
关于Mybaits缓存....
记Mybaits缓存踩的坑 1.问题提出 最近开发一个记录操作前后修改内容的功能,获取修改前数据比较简单,直接从数据库获取,记录修改后的功能也比较简单,直接将用户修改的内容封装成po对象,然后两个比对就可以了ÿ…...
Vue axios调用springboot接口获取数据库数据并显示到网页
axios调用接口获取数据 可以查看简述化的此文 点击 此文简述化文章 PS**由于我自己的本次springboot项目内容很多,所以只是截取了其中关于axios调用接口获取数据的内容,还请大家了解工作原理即可** 前端 添加axios和vue2链接 <script src"htt…...
12-bean创建流程3
文章目录 1 bean实例化前 2. bean实例化doCreateBean() 1 bean实例化前 createBean方法里面的resolveBeforeInstantiation方法,InstantiationAwareBeanPostProcessor接口创建一个代理对象返回 try {// Give BeanPostProcessors a chance to return a p…...
volatile关键字 和 i = i + 1过程
本文是复制粘贴,请直接看原文 原文链接:Java并发编程:volatile关键字解析 - Matrix海子 - 博客园 (cnblogs.com) ------------------------------------------------------------------------------------------------------------------- Java并发编程࿱…...
ubuntu20 安装 cmake 3.27
1. 下载cmake3.27 建议从cmake官网下载安装,虽然比较慢,但从清华镜像里下载的cmake文件不全。 我下载的是:cmake-3.27.7.tar.gz 博客 ubuntu安装cmake的三种方法(超方便!)-CSDN博客 里面提供了三种方法&am…...
faster lio 回环 加入GTSAM优化的记录
首先感谢这位博主的文章:https://blog.csdn.net/weixin_41281151/article/details/125371285,其中部分代码参考于改博主中的github: https://github.com/kahowang/FAST_LIO_SAM 不同的是,我使用的是faster lio进行更改,…...
深入剖析 深度学习中 __init()__函数和forward()函数
目录 前言1. __init()__函数2. forward()函数3. 两者关系 前言 再看代码时,发现init函数和forward函数都有参数,具体是怎么传参的呢? 为了更方便的讲解,会举简单的代码例子结合讲解。 forward() 和 __init__() 是神经网络模型类…...
BUUCTF学习(一):SQL注入,万能密码
1、场景 2、题目 3、解题 用户名:admin or 11# 密码:123456 4、解析SQL注入 “SQL注入是一种常见的Web应用程序漏洞,攻击者可以通过注入的SQL语句获取数据库的敏感信息,对网站用户的数据安全造成威胁。SQL注入的特点包括广泛性、隐…...
基于springboot实现心灵治愈心理健康平台系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现心灵心理健康平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个心灵治愈交流平台 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论…...
百度Apollo自动驾驶
百度从2013年开始布局自动驾驶领域,十年来一直坚持压强式的、马拉松式的研发投入,以技术创新驱动长期发展。百度Apollo L4级自动驾驶运营测试里程累计已超5000万公里,拥有自动驾驶专利族超4600件,其中高级别自动驾驶专利族数全球第…...
数据迁移库工具-C版-01-HappySunshineV1.0-(支持Gbase8a)
一、测试环境信息 名称值CPUIntel(R) Core(TM) i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2Gbase8a版本8.6.2-R43.34.27468a27HappySunshine版本V1.0 二、支持功能 序号功能1GBASE8a到GBASE8a的库级数据迁移。2批量加载。ÿ…...
【sv】 pack/unpack stream
https://www.amiq.com/consulting/2017/05/29/how-to-pack-data-using-systemverilog-streaming-operators/ https://www.amiq.com/consulting/2017/06/23/how-to-unpack-data-using-the-systemverilog-streaming-operators/...
二、使用DockerCompose部署RocketMQ
使用DockerCompose进行部署 docker-compose的版本为 Docker Compose version v2.2.3 RocketMQ的部署方式以及各自的特点 单master模式 只有一个 master 节点,如果master节点挂掉了,会导致整个服务不可用,线上不宜使用,适合个人学习…...
论文笔记[156]PARAFAC. tutorial and applications
原文下载:https://www.sciencedirect.com/science/article/abs/pii/S0169743997000324 摘要 本文介绍了PARAFAC的多维分解方法及其在化学计量学中的应用。PARAFAC是PCA对高阶数组的推广,但该方法的一些特性与普通的二维情况截然不同。例如,…...
AKKA.Net 的使用 来自CHATGPT
请用C# 语言实现一个自动化设备 流水线调度模型,流水线各个环节需要并行执行: 下面是一个使用C#语言实现自动化设备流水线调度模型的简单示例。该示例使用并发编程库System.Threading.Tasks来实现流水线各个环节的并行执行。 csharp using System; usi…...
网络安全—小白学习笔记
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟入…...
OpenRemote: Java 开源 IoT 物联网开发平台,匹配智慧城市、智能家居、能源管理
OpenRemote 是一个直观、用户友好的基于Java语言的开源 IoT 物联网设备管理平台,它包括从连接设备到构建应用程序和特定领域的智能应用程序的所有功能和特性。通过OpenRemote物联网平台,用户可以收集和处理来自不同设备的传感器数据,适用于智…...
GO-unioffice实现word编辑
导包 import ("fmt""log""os""time""github.com/unidoc/unioffice/common/license""github.com/unidoc/unioffice/document" ) 创建word文件 func CreateFile(name string) {filename : name ".docx&quo…...
SpringMVC的拦截器(Interceptor)
拦截器简介 SpringMVC的拦截器Interceptor,主要是对Controller资源访问时进行拦截的基本操作的技术,当然拦截后可以进行权限控制,功能增强等都是可以的。拦截器类似于JavaWeb开发中的Filter,他们之间的区别如下图所示 Filter技术…...
【git】gitlab常用命令
gitlab官网 官网:官网 中文官网:中文官网 默认的gitlab安装目录 /opt/gitlab/bin 启动 gitlab-ctl start 查看状态 gitlab-ctl status 停止 gitlab-ctl stop 重启GitLab gitlab-ctl restart 查看gitlab的配置文件 配置的路径是:/…...
解读下SWD协议以及其应用
SWD协议原理 SWD(Serial Wire Debug)协议是一种用于ARM Cortex微控制器的调试接口协议。它定义了主机计算机与目标设备之间通过SWD线进行通信的格式和规范。 SWD协议使用两根线进行通信:SWDIO(Serial Wire Debug I/O)…...
基于单目的光流法测速
目录 1.简介 2.代码实现 1.简介 基于单目的光流法是一种常见的计算机视觉技术,用于估计图像序列中物体的运动速度。它通过分析连续帧之间的像素变化来推断物体在图像中的移动情况。 背景: 光流法是计算机视觉领域中最早的运动估计方法之一,…...
排序-算法
文章目录 一、排序的概念及引用1.1 排序概念1.2 排序运用1.3 常见排序算法 二、常见排序算法的实现2.1 插入排序2.1.1 基本思想2.1.2 直接插入排序2.1.3 希尔排序 2.2 选择排序2.2.1 基本思想2.2.2 直接选择排序2.2.3 堆排序 2.3 交换排序2.3.1 冒泡排序2.3.2 快速排序2.3.3 快…...
wordpress ajax 插件/市场调研报告模板范文
目录介绍安装介绍 根据wikipedia的介绍: Docker 是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在 Linux 操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制…...
上海网站建设专家/巢湖网站制作
35:输出二进制补码 查看提交统计提问总时间限制: 1000ms内存限制: 65536kB描述输入一个整型(int)的整数,输出它的32位二进制补码。 输入一个整型整数。输出输出一行,即该整数的补码表示。样例输入7 样例输出00000000000000000000000000000111‘ 1 #inclu…...
网站建设公司那家好/网络营销推广的特点
1.Android listview数据没完全加载时滑动界面越界报错。解决办法是先设置setEnabled(false);,加载完后.setEnabled(true); 2.网络访问不能放在主线程,会报错。 3.web端百度地图添加覆盖物,只有IE浏览器不显示,但点击F12后显示,删除…...
泉州找工作网站/百度网站提交入口
1楼.疯狂小悟空06-20 07:13答案引用自问答堂 : http://ask.zol.com.cn/q/727270.html建议你按照下面的方法重新进行设置:1、常规设置: 鼠标右键单击“计算机”图标,选择“属性”,在打开的“系统”窗口点击“远程设置”,…...
做自己个人网站/安卓优化大师下载安装到手机
同源策略及跨域请求的方法和原理(比较JSONP和document.domain的不同及优劣,以及HTML5的跨域方案)JavaScript数据类型JavaScript字符串转化JSONP原理及优缺点XMLHttpRequest事件委托前端模块化(AMD和CommonJS的原理及异同ÿ…...
网站增加导航栏/百度推广怎么登陆
嵌入式Linux下NAND flash上根文件系统构建嵌入式Linux下NAND flash上根文件系统构建摘要:针对嵌入式Linux操作系统,通常选择NAND Flash烧录根文件系统的情况。说明了常用嵌入式文件系统的类型及NANDflash的特点;通过在三星的ARM9 2410S平台上…...