TypeScript起航篇·何为TypeScript?

在这里插入图片描述

你好,我是安然无虞。

文章目录

  • 什么是 TypeScript
  • TypeScript 的特性
    • 类型系统
    • TypeScript 是静态类型
    • TypeScript 是弱类型
    • 总结: 什么是 TypeScript
  • Hello TypeScript

在这里插入图片描述

什么是 TypeScript

  • Typed JavaScript At Any Scale.

  • 添加了类型系统的JavaScript,适用于任何规模的项目。

强调了 TypeScript 的两个最重要的特性——类型系统、适用于任何项目。

TypeScript 的特性

类型系统

从 TypeScript 的名字就可以看出来,类型是其最核心的特性。

同时 TypeScript 也是 JavaScript 的超集,我们知道 JavaScript 是一门非常灵活的编程语言:

  • JavaScript 没有类型约束,一个变量可能初始化时是字符串,过一会又被赋值为数字
  • 由于隐式类型转换的存在,有的变量的类型很难在运行前就确定
  • 基于原型的面向对象编程,使得原型上的属性或方法可以在运行时被修改
  • 函数是 JavaScript 中的一等公民,可以赋值给变量,也可以当做参数或返回值

JavaScript 这种灵活性是一把双刃剑,使得 JavaScript 代码质量参差不齐,维护成本高,运行时错误多。

而 TypeScript 的类型系统,在很大程度上弥补了 JavaScript 的缺点。

TypeScript 是静态类型

类型系统按照 类型检查的时机 来分类,可以分为静态类型和动态类型。

动态类型是指在运行时才会进行类型检查,这种语言的类型错误往往会导致运行时错误。

JavaScript 是一门解释性语言,没有编译阶段,所以它是动态类型,以下代码在运行时会报错:

let foo = 1;
foo.split('');
// Uncaught TypeError: foo.split is not a function
// 运行时会报错(foo.split 不是一个函数),造成线上 bug

静态类型是指在编译阶段就能确定每个变量的类型,这种语言的类型错误往往会导致语法错误。

TypeScript 在运行前需要先编译为 JavaScript,而在编译阶段就会进行类型检查,所以 TypeScript 是静态类型,这段 TypeScript 代码在编译阶段就会报错:

let foo = 1;
foo.split('');
// Property 'split' does not exist on type 'number'.
// 编译时会报错(数字没有 split 方法),无法通过编译

这段 TypeScript 代码和 JavaScript 代码并没有太大的区别,因为大部分的 JavaScript 代码都只需要经过少量的修改(或者完全不用修改)就能变成 TypeScript 代码,这得益于 TypeScript 强大的类型推论,即使不去手动声明变量 foo 的类型,也能在变量初始化时自动推论出它是一个 number 类型。

所以完整的 TypeScript 代码是这样的:

let foo: number = 1;
foo.split('');
// Property 'split' does not exist on type 'number'.
// 编译时会报错(数字没有 split 方法),无法通过编译

TypeScript 是弱类型

类型系统按照 是否允许隐式类型转换 来分类,可以分为强类型和弱类型。

以下代码在 JavaScript 和 TypeScript 中都是可以正常运行的,运行时数字1会被隐式类型转换为字符串’1’,加号’+'被识别为字符串拼接,所以打印出结果是字符串 ‘11’。

console.log(1 + '1');

作为对比,Python是强类型语言,以下代码在运行时会报错:

print(1 + '1')
# TypeError: unsupported operand type(s) for +: 'int' and 'str'

如要修复该错误,需要进行强制类型转换:

print(str(1) + '1')
# 打印出字符串'11'

强/弱是相对的,Python 在处理整型和浮点型相加时,会将整型隐式转换为浮点型,但是这并不影响 Python 是强类型语言的结论,因为大部分情况下 Python 并不会进行隐式类型转换。相比而言,JavaScript 和 TypeScript 中不管加号两侧是什么类型,都可以通过隐式类型转换计算出一个结果——而不是报错——所以 JavaScript 和 TypeScript 都是弱类型。

这样的类型系统体现了 TypeScript 的核心设计理念:在完整保留 JavaScript 运行时行为的基础上,通过引入静态类型系统来提高代码的可维护性,减少可能出现的bug。

总结: 什么是 TypeScript

  • TypeScript 是添加了类型系统的 JavaScript,适用于任何规模的项目。
  • TypeScript 是一门静态类型、弱类型的语言。
  • TypeScript 是完全兼容 JavaScript 的,它不会修改 JavaScript 运行时的特性。
  • TypeScript 可以编译为 JavaScript,然后运行在浏览器、Node.js 等任何能运行 JavaScript 的环境中。
  • TypeScript 拥有很多编译选项,类型检查的严格程度由你决定。
  • TypeScript 可以和 JavaScript 共存,这意味着 JavaScript 项目能够渐进式的迁移到 TypeScript。
  • TypeScript 增强了编辑器(IDE)的功能,提供了代码补全、接口提示、跳转到定义、代码重构等能力。
  • TypeScript 拥有活跃的社区,大多数常用的第三方库都提供了类型声明。
  • TypeScript 与标准同步发展,符合最新的 ECMAScript 标准。

Hello TypeScript

我们从一个简单的例子开始:

在 hello.ts 文件中有以下代码:

function sayHello(person: string) {
   return 'Hello ' + person;
}

let user = 'Tom';
console.log(sayHello(user));

然后执行:

tsc hello.ts

这个时候会生成一个编译好的 hello.js 文件:

function sayHello(person) {
    return 'Hello ' + person;
}
var user = 'Tom';
console.log(sayHello(user));

在TypeScript代码中,我们用 : 指定person参数类型为string,但是编译成 js 之后,并没有什么检查的代码被插入进来。

这是因为 TypeScript 只会在编译时对类型进行静态检查,如果发现有错误,编译的时候就会报错。而在运行时,与普通的 JavaScript 文件一样,不会对类型进行检查。

如果我们需要保证运行时的参数类型,还是得手动对类型进行判断:

function sayHello(person: string) {
    if (typeof person == 'string') {
        return 'Hello ' + person;
    } else {
        throw new Error('Person is not a string');
    }
}
let user = 'Tom';
console.log(sayHello(user));

接下来尝试把这段代码编译一下:

function sayHello(person: string) {
    return 'Hello ' + person;
}

let user = [0, 1, 2];
console.log(user);

编译其中会提示错误,编译的时候也会报错:

hello.ts:6:22 - error TS2345: Argument of type 'number[]' is not assignable to parameter of type 'string'.

但是还是生成了js文件:

function sayHello(person) {
    return 'Hello ' + person;
}
var user = [0, 1, 2];
console.log(sayHello(user));

这是因为 TypeScript 编译的时候即使报错了,还是会生成编译结果,我们仍然可以使用这个编译后的文件。

如果要在编译报错的时候终止js文件的生成,可以在 tsconfig.json 中配置 noEmitOnError 即可。

遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~

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

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

相关文章

鸿蒙系统的优势 不足以及兼容性与未来发展前景分析

2024 年 10 月 22 日:华为正式发布原生鸿蒙操作系统 HarmonyOS next,并正式命名为 HarmonyOS 5,这是鸿蒙系统史上最大的升级,实现了国产操作系统从底层架构到应用生态的全面自主可控。 鸿蒙系统与安卓、iOS 相比,具有…

基于凌鸥LKS32MC037鱼缸用FOC潜水泵控制器

随着老百姓生活水平的提高,室内养殖观赏型鱼类的人越来越多,这就催生了鱼缸内小型潜水泵的市场发展。 早期鱼缸潜水泵都采用的方波驱动的控制器。随着技术的进步和芯片成本的下降,本文介绍的基于无感FOC算法潜水泵控制器已经成熟应用并且大批…

WMV怎么转MP4?五个简单好用的视频格式转换方法!

WMV格式,全称为Windows Media Video,是由微软公司开发的一种视频文件格式。采用先进的视频压缩技术,能够在保持较高视觉质量的同时,显著减小文件体积,经常被用于在网络环境下即时观看或收听高质量的音视频内容。同时&a…

unity搭建场景学习

unity搭建场景学习 创建场景创建gameobject创建材质,用于给gameobject上色拖拽材质球上色上色原理设置多个材质方式设置贴图的方式 效果设置光滑度一些预览设置菜单渲染模型与碰撞模型网格渲染参数1. materials(材质)2. lighting(光照)3. reflection probes(反射探针…

C++ Qt

一、概念 跨平台的图形应用界面应用程序框架。 二、常用快捷键 快捷键解释F4在对应的.cpp和.h之间快速切换ctrl b编译程序ctrl r运行程序ctrl shift ↑ / ↓向上 / 下移动选中的代码ctrl i自动对齐选中的代码 三、对象树 总结:父控件被析构,包含…

爬虫笔记22——当当网图书详情页静、动态数据爬取

当当网动态数据爬取 静态数据爬取动态数据爬取接口参数的获取 静态数据爬取 进入图书详情,这里的图书数据信息比如标题、价格、图片都是非结构化数据,可以使用xpath语法提取。是很简单的数据采集了,就不细说了。 动态数据爬取 滑到下面这里的…

zip文件加密成图片文件-到解密

加密 1,准备:图片 zip文件 2,新建一个.txt 根据自己的对应文件修改: copy 图片名.后缀/b压缩包名.后缀自定义图片名.后缀注意,图片后缀最后保持一至,测试了 jpg png 压缩包 zip 3,把上…

【深度学习】Bert下载和使用(以bert-base-uncased为例)

【深度学习】Bert下载和使用(以bert-base-uncased为例) 代码报错报错原因解决方法解决步骤1.进入Hugging Face,检索bert-base-uncased2.点击Files and versions3.下载文件4.下载的文件放入文件夹5.代码修改 代码报错 bert BertModel.from_p…

Java基于SpringBoot 的校园外卖点餐平台微信小程序(附源码,文档)

大家好,我是Java徐师兄,今天为大家带来的是Java基于SpringBoot 的校园外卖点餐平台微信小程序。该系统采用 Java 语言 开发,MySql 作为数据库,系统功能完善 ,实用性强 ,可供大学生实战项目参考使用。 博主介…

ES索引:索引管理

索引管理 再讲索引(Index)前,我们先对照下 ElasticSearch Vs 关系型数据库: PUT /customer/_doc/1 {"name": "DLBOY" }系统默认是自动创建索引的 如果我们需要对这个建立索引的过程做更多的控制&#xff1a…

Python小游戏20——超级玛丽

首先,你需要确保你的Python环境中安装了pygame库。如果还没有安装,可以使用以下命令进行安装: bash pip install pygame 运行效果展示 代码展示 python import pygame import sys # 初始化pygame pygame.init() # 设置屏幕尺寸 screen_width …

ZDH权限-扩展支持数据权限

目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限扩展更细粒度方案 第一种方案: 第二种方案: ZDH权限扩展支持数据权限-新增属性 总结 感谢支持 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽取平台 预览地址 后…

Unity humanoid 模型头发动画失效问题

在上一篇【Unity实战笔记】第二十二 提到humanoid 模型会使原先的头发动画失效,如下图所示: 头发摆动的是generic模型和动画,不动的是humanoid模型和动画 一开始我是尝试过在模型Optimize Game objects手动添加缺失的头发骨骼的,奈…

数据结构之线段树

线段树 线段树(Segment Tree)是一种高效的数据结构,广泛应用于计算机科学和算法中,特别是在处理区间查询和更新问题时表现出色。以下是对线段树的详细解释: 一、基本概念 线段树是一种二叉搜索树,是算法竞…

Kubernetes——part9-2 kubernetes集群java项目上云部署

一、部署前准备工作 1.1 部署项目情况 1.1.1 业务部署架构 单体服务架构分布式服务架构微服务架构超微服务架构 1.1.2 项目涉及第三方服务 关系型数据库系统 MySQL缓存服务 Redis memcache协调服务 zookeeper消息中间件服务 kafka rabbitmq服务注册 服务发现 nacos 1.1.3…

Verilog实现的莫尔斯电码发生器

莫尔斯或者摩尔斯电码(Morse Code),发明于1837年(另有一说是1836年),通过不同的排列顺序来表达不同的英文字母、数字和标点符号,在这里作一简单处理,仅产生点(Dit)和划(Dah),时长在0.25秒之内为点,超过为划…

【输出1到N之间的偶数】

【输出1到N之间的偶数】 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 请写程序实现输出1-N之间的所有偶数。 输入 输入一个整数N 输出 如果N<1输出error&#xff0c;否则&#xff0c;输出1-N之间…

Mac上的免费压缩软件-FastZip使用体验实测

FastZip是Mac上的一款免费的压缩软件&#xff0c;分享一下我在日常使用中的体验 压缩格式支持7Z、Zip&#xff0c;解压支持7Z、ZIP、RAR、TAR、GZIP、BZIP2、XZ、LZIP、ACE、ISO、CAB、PAX、JAR、AR、CPIO等所有常见格式的解压 体验使用下来能满足我所有的压缩与解压的需求&a…

华为云计算知识总结——及案例分享

目录 一、华为云计算基础知识二、华为云计算相关案例实战案例一&#xff1a;搭建弹性云服务器&#xff08;ECS&#xff09;并部署Web应用案例二&#xff1a;构建基于OBS的图片存储和分发系统案例三&#xff1a;基于RDS的高可用数据库应用案例四&#xff1a;使用华为云DDoS防护保…

RHCE——DNS域名解析服务器、selinux、防火墙

1、DNS简介 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 DNS 系统使用的是网络的查询&#xff0c;那么自然需要有监听的 port 。 DNS 使…