《TypeScript 快速上手:类型、编译与严格模式的简明教程》

 


一、TypeScript介绍

在引入编程社区 20 多年后,JavaScript 现在已成为有史以来应用最广泛的跨平台语言之一。JavaScript 最初是一种用于向网页添加微不足道的交互性的小型脚本语言,现已发展成为各种规模的前端和后端应 用程序的首选语言。虽然用 JavaScript 编写的程序的大小、范围和复杂性呈指数级增长,但 JavaScript 语言表达不同代码单元之间关系的能力却没有。结合 JavaScript 相当奇特的运行时语义,语言和程序复 杂性之间的这种不匹配使得 JavaScript 开发成为一项难以大规模管理的任务。

程序员编写的最常见的错误类型可以描述为类型错误:在预期不同类型的值的地方使用了某种类型的 值。这可能是由于简单的拼写错误、无法理解库的 API 表面、对运行时行为的错误假设或其他错误。 TypeScript 的目标是成为 JavaScript 程序的静态类型检查器——换句话说,是一个在代码运行之前运行 的工具(静态)并确保程序的类型正确(类型检查)。 TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集,而且本质上向这 个语言添加了可选的静态类型和基于类的面向对象编程。

总而言之,ts是js的语言扩展,给js提供了一层类型检查。

二、JS ,ES ,TS的关系

TypeScript 是 JavaScript 的超集,即包含JavaScript 的所有元素,能运行JavaScript 的代码,并扩展了 JavaScript 的语法。相比于JavaScript ,它还增加了静态类型、类、模块、接口和类型注解方面的功能, 更易于大项目的开发。  

 

 三、TypeScript 与 JavaScript 的区别

 

四、 TypeScript入门

JavaScript实际中问题 

JavaScript 中的每个值都有一组行为,您可以通过运行不同的操作来观察。这听起来很抽象,我们来举 一个简单的例子,考虑我们可能对名为 message 的变量运行的一些操作:

// 在 'message' 上访问属性 'toLowerCase',并调用它
message.toLowerCase();
// 调用 'message'
message();

如果我们分解它,第一行可运行的代码访问一个属性 toLowerCase ,然后调用它。第二个尝试 message 直接调用。

但是假设我们不知道 message 。这很常见——我们无法可靠地说出尝试运行任何这些代码会得到什么结果。每个操作的行为完全取决于我们最初给 message 的赋值。

  • 可以调用 message 吗?
  • 它有 toLowerCase 这个属性吗?
  • 如果能, toLowerCase 可以调用吗?
  • 如果这两个值都是可调用的,它们返回什么?

这些问题的答案通常是我们在编写 JavaScript 时牢记在心的东西,我们必须希望所有细节都正确。

假设 message 按以下方式定义:

const message = "Hello World!";

正如您可能猜到的,如果我们尝试运行 message.toLowerCase() ,我们只会得到相同的小写字符串。 那第二行代码呢?如果您熟悉 JavaScript,您就会知道这会失败并出现异常:

TypeError: message is not a function

如果我们能避免这样的错误,那就太好了。

当我们运行我们的代码时,我们的 JavaScript 运行时选择做什么的方式是通过确定值的类型——它具有 什么样的行为和功能。这 TypeError就是暗指的一部分- 它说字符串 "Hello World!" 不能作为函数调用。

TypeScript就用诸多特性为我们解决了困扰我们的问题,我接下来将介绍他们:

静态类型检查

回想一下 TypeError 我们之前尝试将 string 作为函数调用的情况。 大多数人不喜欢在运行他们的代码 时出现任何类型的错误 - 这些被认为是错误!当我们编写新代码时,我们会尽量避免引入新的错误。

理想情况下,我们可以有一个工具来帮助我们在代码运行之前发现这些错误。这就是像 TypeScript 这样 的静态类型检查器所做的。 静态类型系统描述了当我们运行程序时我们的值的形状和行为。像 TypeScript 这样的类型检查器,告诉我们什么时候事情可能会出轨。

 

非异常故障

例如,规范说尝试调用不可调用的东西应该抛出错误。也许这听起来像是“明显的行为”,但您可以想象 访问对象上不存在的属性也应该抛出错误。相反,JavaScript 给了我们不同的行为并返回值 undefined。

最终,静态类型系统要求必须调用哪些代码,应该在其系统中标记,即使它是不会立即抛出错误的“有 效”JavaScript。比如:在 TypeScript 中,以下代码会产生关于 location 未定义的错误:

TypeScript 可以在我们的程序中捕获很多合法的错误。

  • 错别字
  • 未调用的函数
  • 或基本逻辑错误

显式类型

引入一个案例:

hello.ts

function greet(person, date) {console.log(`Hello ${person}, today is ${date}!`);
}greet("hyyyyy");

 到现在为止,我们还没有告诉 typescript person 或者 date 是什么类型。当我们编辑代码时会告诉 TypeScript person 是一个 string ,那 date 应该是一个 Date 对象。

有了这个,TypeScript 可以告诉我们其他 greet 可能被错误调用的情况。例如修改一下 hello.ts 代 码:

function greet(person: string, date: Date) {console.log(`Hello ${person}, today is ${date.toDateString()}!`);
}

但是:

嗯?TypeScript 在我们的第二个参数上报告了一个错误,这是为什么呢? 也许令人惊讶的是, Date() 在 JavaScript 中调用会返回一个 string 。可以使用 new Date() 满足我们 的期望,快速修复错误: 

function greet(person: string, date: Date) {console.log(`Hello ${person}, today is ${date.toDateString()}!`);
}greet("hyyyy", new Date());

降级编译

什么是 TypeScript 降级编译?

TypeScript 降级编译是指将 TypeScript 代码编译为较低版本的 JavaScript 代码(如 ES5、ES3 等),以确保代码可以在旧版浏览器或环境中运行。

  • 为什么需要降级编译?
    • 新版 JavaScript(如 ES6+)引入了许多新特性(如箭头函数、类、模块等),但这些特性在旧版浏览器(如 IE11)或某些环境中不被支持。
    • 通过降级编译,可以将这些新特性转换为旧版 JavaScript 语法,从而确保代码的兼容性。

ypeScript 编译器(tsc)的作用

TypeScript 编译器(tsc)是 TypeScript 的核心工具,负责将 TypeScript 代码编译为 JavaScript 代码。它支持以下功能:

  • 将 TypeScript 语法转换为 JavaScript 语法。
  • 支持将代码降级到指定的 JavaScript 版本(如 ES5、ES3)。
  • 提供类型检查和错误提示。

 目标版本(target)​

在 TypeScript 编译中,target 是一个关键配置选项,用于指定编译后的 JavaScript 目标版本。例如:

  • es3:将代码编译为 ES3 语法(兼容性最好,但代码体积较大)。
  • es5:将代码编译为 ES5 语法(兼容大多数旧版浏览器)。
  • es6(或 es2015):将代码编译为 ES6 语法(支持现代浏览器)。
  • esnext:将代码编译为最新版本的 JavaScript。

严格模式

不同的用户使用 TypeScript 在类型检查器中,希望检查的严格程度不同。

有些人正在寻找更宽松的验证体验,它可以帮助仅验证其程序的某些部分,并且仍然拥有不错的工具。这是 TypeScript 的默认体验, 其中类型是可选的,推理采用最宽松的类型,并且不检查潜在的 null / undefined 值,就像 tsc 面对错 误时如何编译生成JS文件一样。如果你要迁移现有的 JavaScript,这可能是理想的第一步。

相比之下,许多用户更喜欢让 TypeScript 尽可能多地立即验证,这就是该语言也提供严格性设置的原 因。这些严格性设置将静态类型检查,从开关(无论您的代码是否被检查)转变为更接近于拨号的东西。你把这个拨盘调得越远,TypeScript 就会为你检查越多。这可能需要一些额外的工作,但总的来 说,从长远来看,它是物有所值的,并且可以实现更彻底的检查和更准确的工具。如果可能,新的代码 库应该始终打开这些严格性检查。

TypeScript 有几个可以打开或关闭的类型检查严格标志,除非另有说明,否则我们所有的示例都将在启 用所有这些标志的情况下编写。在命令行里设置 strict ,或在 tsconfig.json 中配置 "strict": true 将它打开。


 

 


 

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

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

相关文章

ROS2 系统架构

1.操作系统层 ros2是基于Linux、Windows、macOS系统建立的,这一层为ros2提供了各种基础的硬件驱动,比如网卡驱动,常用USB驱动和常用摄像头驱动等。 2.DDS实现层 ros2的核心通信是采用第三方的通信组件来实现的,这个第三方就是数…

【HTML】二、列表、表格

文章目录 1、列表1.1 无序列表1.2 有序列表1.3 定义列表 2、表格2.1 定义2.2 表格结构标签2.3 合并单元格 1、列表 列表分为: 无序列表有序列表定义列表:一个标题下有多个小分类 1.1 无序列表 ul嵌套li,ul是无序列表,li是列表…

redis zset基本介绍以及底层实现

ZSet(Sorted Set)有序集合 介绍 Redis 中的有序集合(Sorted Set)是在集合(Set)的基础上,为每个成员关联了一个分数(score)。这个分数可以用来对集合中的成员进行排序。 有序集合保留了集合不能有重复成员的特性(成员不能重复,分值…

政策助力,3C 数码行业数字化起航

政策引领,数字经济浪潮来袭 在当今时代,数字经济已成为全球经济发展的核心驱动力,引领着新一轮科技革命和产业变革的潮流。我国深刻洞察这一发展趋势,大力推进数字化经济发展战略,为经济的高质量发展注入了强大动力。 …

IntelliJ IDEA 快捷键系列:重命名快捷键详解

目录 引言一、默认重命名快捷键1. Windows 系统‌2. Mac 系统‌ 二、操作步骤与技巧1. 精准选择重命名范围‌2. 智能过滤无关内容‌ 三、总结 引言 在代码重构中,‌重命名变量、类、方法‌ 是最常用的操作之一。正确使用快捷键可以极大提升开发效率。本文针对 ‌Ma…

文档搜索引擎

首先获取很多网页(爬虫->一个http客户端,发送http请求获取http响应结果(就是网站))(批量化的获取很多的页面) 再根据用户输入的查询词,在网页中进行查找 用户输入查询词之后,如何让查询词和当前这些网页进行匹配 ->使用倒排索引 倒排索引 1.文档: 每个待搜索的网页(被爬…

开源工具利器:Mermaid助力知识图谱可视化与分享

在现代 web 开发中,可视化工具对于展示流程、结构和数据关系至关重要。Mermaid 是一款强大的 JavaScript 工具,它使用基于 Markdown 的语法来呈现可定制的图表、图表和可视化。对于展示流程、结构和数据关系至关重要。通过简单的文本描述,你可…

C# --- LINQ

C# --- LINQ 什么是LINQFluent Syntax 和 SQL-Like QueryLINQ Operations 什么是LINQ LINQ的全称为Language Integrated Query, 为各种查询(包括对象查询,数据库查询,XML查询) 提供了统一模型.LINQ源于SQL,但比SQL更加强大,更加灵…

【AI News | 20250316】每日AI进展

AI Repos 1、ReActMCP 将网络搜索能力集成到AI助手中的一个MCP服务:ReActMCP Web Search,相当于给AI装了个搜索引擎,可以实时查找最新的内容。它基于Exa API执行基本和高级网络搜索,高级搜索比如限制搜索的网站范围、指定日期范围…

【VUE】day04-组件的生命周期、组件之间的数据共享、ref引用、购物车案例

【VUE】day04-组件的生命周期、组件之间的数据共享、ref引用、购物车案例 1. 组件之间的关系2. 使用组件的三个步骤3. vue.components全局注册组件4. 自动生成右边标签插件5. 组件的props6. 结合v-bind使用自定义属性7. props的默认default值8. type值类型9. 组件之间的样式冲突…

Redis分布式锁深度剖析:从原理到Redisson实战,破解脑裂与高并发锁难题

一、📌 分布式锁的核心应用场景 场景类型典型案例风险说明🚀 高并发场景电商秒杀、票务抢购库存超卖风险⏰ 定时任务场景集群日志清理、数据统计任务重复执行🔄 幂等场景支付接口重试、订单创建资金重复扣款 二、🔧 Redis分布式锁…

量化交易学习笔记02:双均线策略

双均线策略示例 个股:中国平安 回测日期:2022-5-1至2023-5-1 短均线:5天 长无线:10天 代码: def initialize(context):# 初始化此策略# 设置我们要操作的股票池, 这里我们只操作一支股票# """标的&qu…

交换机控制软件的实现步骤猜测

一、主要目的 提出对交换机软件控制逻辑的猜测。 二、交换机控制软件的组成 (一)背景 1、交换机有很多的RJ45水晶头端口。 2、每个端口支持同时发送和接收字节数据。 3、每个端口接收的数据需要查表后才能转发给目标端口。 (二)端口状态扫描线程 负责扫描每个端口的状态&#x…

Part1:基于国内源完成Kubernetes集群部署

集群规划 操作系统:CentOS7 内核版本:5.4(需升级) 组件版本说明操作系统内核5.4RPM方式升级docker26.1.4yum安装cri-docker0.3.16二进制安装kubeadm1.30.11yum安装kubealet1.30.11yum安装kubectl1.30.11yum安装kubectl1.30.11yu…

中考英语之10难点单词

A abandon ~动词,意为 “抛弃;放弃”。 ~例如 He abandoned his old bike by the roadside.(他把他的旧自行车扔在路边。) absolute ~形容词,“绝对的;完全的”。 ~例如 We have absolute trust in him…

【GPT入门】第24课 langfuse介绍

【GPT入门】第24课 langfuse介绍 1. langfuse概念与作用2. 代码3. 页面效果4. 设计模式1. 装饰器模式2. 上下文管理模式1. langfuse概念与作用 Langfuse是一款专为大规模语言模型(LLM)应用开发设计的开源平台。其作用主要包括以下几个方面: 提升开发效率:通过消除LLM应用构…

在 React 中使用 Web Components 的实践操作

前言 在现代前端开发中,React 和 Web Components 都是广泛使用且备受欢迎的技术。React 是一个用于构建用户界面的 JavaScript 库,提供了组件化的开发方式和高效的状态管理,而 Web Components 是一套原生的浏览器技术标准,允许开…

C++单例模式精解

单例模式(重点*) 单例模式是23种常用设计模式中最简单的设计模式之一,它提供了一种创建对象的方式,确保只有单个对象被创建。这个设计模式主要目的是想在整个系统中只能出现类的一个实例,即一个类只有一个对象。 将单…

【微服务】java中http调用组件深入实战详解

目录 一、前言 二、http调用概述 2.1 什么是http调用 2.1.1 http调用步骤 2.2 HTTP调用特点 2.3 HTTP调用应用场景 三、微服务场景下http调用概述 3.1 微服务开发中http调用场景 3.2 微服务组件中http的应用 四、常用的http调用组件 4.1 java中常用的http组件介绍 4…

Implementing SAP BPC Embedded - 2nd Edition

Implementing SAP BPC Embedded - 2nd Edition