TypeScirpt 入门与实战 学习笔记

news2024/11/25 7:30:04

文章目录

  • 求一键三连
  • 前言
  • 了解TS的前世今生
  • 基本实现
  • 数据类型
    • 枚举类型 enum(用的少)
    • 顶端类型(通用类型)
      • any
      • unknown
      • 对比
      • never
    • 数组
      • 只读 :readonly
    • 元组 类型
    • object
    • Object和Object()区分
  • 命名空间(了解,被ES模块淘汰)
  • 模块(重点)
    • 模块的实现方式
    • ES模块(官方标准模块)
  • .d.ts文件
  • package.json
  • TS项目配置
    • tsconfig.json
    • 工程引用(重要)
      • 使用工程引用:
    • solution模式(常用)
  • TS与Babel
  • TS与webpack
    • TS与ESLint

求一键三连

如果对您有帮助,请点赞收藏和关注,您的点赞是我更新的动力

前言

之前看了几篇TS的文章,但是在实际使用的时候还是没有概念,所以去图书馆借了一本TS入门与实战来看,做做笔记,一定要做笔记,不然真的会忘,做笔记的同时也是在梳理自己的知识图谱。

也在掘金看到了一些比较好的文章,写的也很详细,重复的就不写了,重点写一些我觉得需要记忆的,和对比js之类的,书里面写的确实还是很详细,看了之后理解也不一样。
参考文章真的写的挺好的,值得仔细看看。

了解TS的前世今生

我觉得书里这一点写的特别好,让我知道为什么需要用TS,为什么要拥抱TS。
一句话:TypeScript是一门专为开发大规模JS应用程序而设计的编程语言。
为什么要使用=>好处是什么:

  1. 易于发现代码中的错误,它的出现也是这个原因,JS是弱类型语言,在代码中会出现类型转换的各种问题。
  2. 开放和跨平台,最重要的是跨平台,因为TS不是直接执行的,是编译成js之后再进行执行的,所以就很好的解决了js的版本兼容问题,可以让一份TS代码,编译成各种JS版本的代码,这一点真的很赞,一门具有跨平台的语言是好语言的必备(例如Java)。
  3. 始于JS,终于JS。TS实现的原理让js的库可以用在TS上,js程序可以很方便的迁移到TS,这一点也让它迅速火起来。同时TS可以使用最新的JS特性,不用考虑兼容性了。

看完这个我其实最大的感受就是跨平台的重要性!实现的原理都是大同小异的。


基本实现

体验 TypeScript
运行代码:npx tsc hello.ts 就会生成对应的hello.js文件
(npx:定义为npm包的执行者)
也可以用tsc:build -tsconfig.json来执行,也会生成.js文件
ts运行的配置在tsconfig.json文件中

一般的配置:

// tsconfig.json
{
    "compilerOptions": {
        // 不报告执行不到的代码错误。
        "allowUnreachableCode": true,
        // 必须标注为null类型,才可以赋值为null
        "strictNullChecks": true,
        // 严格模式, 强烈建议开启
        "strict": true,
        // 支持别名导入:
        // import * as React from "react"
        "esModuleInterop": true,
        // 目标js的版本
        "target": "es5",
        // 目标代码的模块结构版本
        "module": "es6",
        // 在表达式和声明上有隐含的 any类型时报错。
        "noImplicitAny": true,
        // 删除注释
        "removeComments": true,
        // 保留 const和 enum声明
        "preserveConstEnums": false,
        // 生成sourceMap    
        "sourceMap": true,
        // 目标文件所在路径
        "outDir": "./lib",
        // 编译过程中需要引入的库文件的列表
        "lib": [
            "dom",
            "es7"
        ],
        // 额外支持解构/forof等功能
        "downlevelIteration": true,
        // 是否生成声明文件
        "declaration": true,
        // 声明文件路径
        "declarationDir": "./lib",
        // 此处设置为node,才能解析import xx from 'xx'
        "moduleResolution": "node"
    },
    // 入口文件
    "include": [
        "src/main.ts"
    ]
}

数据类型

为vue3学点typescript, 基础类型和入门高级类型
对比JS的八种数据类型,JS的数据类型都是大写开头,
原始数据类型七种:

  1. Undefined
  2. Null
  3. Number
  4. String
  5. Boolean
  6. Symbol(唯一且不可改变,用在对象内部属性名)
  7. BigInt(任意精度的整数)

非原始数据类型:Object

TS的原始数据类型是

  1. undefined
  2. null
  3. number
  4. string
  5. boolean
  6. symbol(唯一且不可改变,用在对象内部属性名)
  7. bigInt(任意精度的整数)
  8. void(函数无返回值)

开启严格模式后,undefined和null不可以赋值给其他类型,避免出错

枚举类型 enum(用的少)

枚举是ts中有而js中没有的类型, 编译后会被转化成对象, 默认元素的值从0开始,

enum Color {Red, Green, Blue}
// 等价
enum Color {Red=0, Green=1, Blue=2}

数值型:默认从0开始
可以赋值给number类型,也可以把number类型赋值给枚举类型成员

字符串型:要初始化才可以使用,有点像对象

enum Color {Red="abc", Green="cba"}
const a:string=Color.red;  // abc

注意不可以把string类型的值赋值给字符串枚举类型
异构型(组合型):没啥好说的

顶端类型(通用类型)

any

any代表任意类型, 也就是说, 如果你不清楚变量是什么类型, 就可以用any进行标记, 比如引入一些比较老的js库, 没有声明类型, 使用的时候就可以标记为any类型, 这样ts就不会提示错误了. 当然不能所有的地方都用any, 那样ts就没有使用的意义了.

不会对这个类型进行类型坚持,但是要少用,不然就没有意义了

unknown

比any更安全,就像它的名字,就是它的应用场景
相比于any不可以对它做很多操作

对比

在这里插入图片描述

never

任何值都不可以赋值给never,用于函数异常


数组

主要是了解联合类型的数组,以及两种不同的表达风格

const red:(stirng | number)[ ]=[ 'f ', 1 , 2];  //我选择这种,更方便
//泛型的表达方式
const red:Arrary<stirng | number>=[ 'f ', 1 , 2]; 

有一个bug,TS无法判断出数组访问是否越界,这就很呆!

只读 :readonly

一般来说在前面加一个readonly就可以了。
还有其他方法
Readonly < T > ,那么T类型就是只读了

元组 类型

数组的子类型,但是每个元素的类型都要是确定的,也就是说每个都要单独写
?: 说明是可选类型,可写可不写
剩余元素,后面的就不一个个手写了: …T[] 表示接下来都是T类型
元组的长度本身是固定的,会有越界错误,但是如果加了这最后一个就不固定了,很好理解。

object

object表示非原始类型

let o1:object = [];
let o2:object = {a:1,b:2};

但是, 我们实际上基本不用object类型的, 因为他标注的非常不具体, 一般都用接口来标注更具体的对象类型。

同时在书上说到object只能访问对象的公共属性和方法,这一点也是要注意的,一般用对象字面量来创建对象

Object和Object()区分

这里要区分Object()构造函数和Object
Object表示一种类型,而Object()是一个值。

Object()很少用来创建对象,值的类型是ObjectConstructor

而Object类型是特殊对象Object.prototype的类型,也就是原型的类型,该类型的主要作用是描述JS中几乎所有对象都共享(通过原型继承)的属性和方法。
所以Object不能用来定义自定义变量其实Object也几乎用不到,做一个了解


命名空间(了解,被ES模块淘汰)

首先是不建议使用命名空间,如果你的项目直接是用ts写的可能用不上namespace, 模块天然就有隔离分组作用.

为 Vue3 学点 TypeScript, 命名空间(namespace)是什么?
作为一个补充参考吧

这里我觉得书上写的很好,很清晰, 是什么,干什么,最后为什么不用!

namespce来声明命名空间,原理是用立即执行的函数表达式创建一个块级作用域,避免命名冲突。
在这里插入图片描述
在这里插入图片描述

关于多文件的命名空间的合并和依赖,可以在tsconfig.json文件中配置文件定义文件加载顺序,比如a依赖b,那么b需要先加载。
在这里插入图片描述


模块(重点)

模块的实现方式

之前一直ES一直没有给出官方的模块实现方案,所以都是大家自己实现模块,有三种方案

  1. CommonJS模块,只能在服务器端运行
  2. AMD模块,异步模块,只能在浏览器端运行
  3. UMD模块,通用模块,可以在浏览器和服务器端运行

这里就不对三种过去的模块进行记录了,因为现在都用ES模块。

这里对require进行说明,在没有使用ESM之前是用require进行导入的,require=import

ES模块(官方标准模块)

import导入,export导出,一个文件为一个模块,每个模块拥有独立的模块作用域
在这里插入图片描述
export default{ } 导出的是默认模块
那么导入时,直接 import name from 'mod' 这个name可以随便起,导入的就是默认模块
还可以写成 import name from './utils' 这样的形式
如果用as则是重命名,这个在export和import里都是通用的。

.d.ts文件

是ts的声明文件。
有内置的声明文件、安装的第三方声明文件、自定义声明文件。

package.json

每一个npm包都有一个标准的package.json文件,描述当前npm包的基础信息,或者是项目的信息

TS项目配置

tsconfig.json

json:JS对象表示法,一般都是配置文件

tsc是TS的编译器,这个json文件就是它的编译配置文件,具体的内容前面有写。

工程引用(重要)

首先要明确的概念就是,当工程变大之后,就需要把一个大的工程拆分成多个独立的子工程,然后就需要把这些子工程关联在一起。

这有很多的好处,包括我在青训营第一次写项目时也是这样的配置,每个子工程可以有独立的配置和类型检查。真的特别有用。

在这里插入图片描述
关键词:依赖关系 独立的配置 类型检查

使用工程引用:

要在tsconfig.json中进行配置

  • 使用reference属性配置当前工程所引用的其他工程。
  • 被引用的工程启用composite编译选项,设置为ture。

例子:
references:[
{“path”:“…/pkg1”},//可以是json文件的目录
{“path”:“…/pkg2/tsconfig.json”} //也可以是对应的配置文件
]

solution模式(常用)

建一个大工程,里面含有多个子工程,在大工程的tsconfig.json中进行整体的子工程配置,这时就是进行子项目的关联,就比较方便,只要写一个references就行了。
在这里插入图片描述

TS与Babel

TS自带代码转译功能,但是很多项目一开始没有使用TS,都是用的Babel,所以还是要了解Babel。
TS可以对TS和JS的代码进行静态类型检查,还可以对TS和JS的代码进行转译

一种常见的模式是:用TS来进行静态类型判断,用Babel进行代码转译,这样的方式可以兼容更多项目

babel主要是讲es6的语法转译成es5的语法以便兼容
在这里插入图片描述

babelrc.json文件中进行配置

在这里插入图片描述

TS与webpack

在这里插入图片描述

webpack.config.js是配置文件
Webpack配置全解析(基础篇)

若要打包TS文件,则必须要按照TS文件加载器。

TS与ESLint

静态程序分析工具
在这里插入图片描述
配置文件:.es-lintrc.* 各种类型的文件都有,一般用json

具体的配置说明网上搜一下即可。

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

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

相关文章

论文阅读 :Masked Autoencoders As Spatiotemporal Learners

NeurIPS2022——Masked Autoencoders As Spatiotemporal Learners Keywords&#xff1a; Videos&#xff1b;object detection&#xff1b; 文章目录NeurIPS2022——Masked Autoencoders As Spatiotemporal Learners研究动机本文贡献Introduction & Related work整体架构&…

redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?

0. 引言 最近线上的一个状态修改功能出现了问题&#xff0c;一开始是运营找了过来&#xff0c;运营告知某条数据的状态已经开启了的&#xff0c;但是实际使用起来还是没有生效&#xff0c;于是拿到这个问题后&#xff0c;首先就去数据库查了这条数据&#xff0c;发现确实如他所…

深入了解字典树

字典树&#xff08;Trie&#xff09; 目录字典树&#xff08;Trie&#xff09;一、问题引入二、字典树介绍3、字典树的实现4、存储与查询一、问题引入 现有长度为n的字符串数组&#xff0c;[“go”&#xff0c;“goog”&#xff0c;“google”&#xff0c;“golang”&#xff0…

【数据结构入门】-链表之双向循环链表

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【数据结构初阶&#xff08;C实现&#xff09;】 文章目录链表初始化打印链表尾插尾删新建一个节点头插头删查找在pos之前插入*删除pos位…

CSS中的伪元素和伪类

一直被伪类和伪元素所迷惑&#xff0c;以为是同一个属性名称&#xff0c;根据CSS动画&#xff0c;索性开始研究a:hover:after&#xff0c;a.hover:after的用法。 伪元素 是HTML中并不存在的元素&#xff0c;用于将特殊的效果添加到某些选择器。 对伪元素的描述 伪元素有两…

【Verilog】握手信号实现跨时钟域数据传输-handshake

文章目录handshake握手电路使用握手信号实现跨时钟域数据传输接口信号图题目描述解题思路代码设计数据发送模块data_driver数据接收模块data_receivertestbench波形handshake握手电路 跨时钟域处理是个很庞大并且在设计中很常出现的问题握手(handshake)是用来处理信号跨时钟域…

数字化引领乡村振兴,VR全景助力数字乡村建设

一、数字乡村建设加速经济发展随着数字化建设的推进&#xff0c;数字化农业产业正在成为农业产业发展的主导力量&#xff0c;因此数字化技术赋予农业产业竞争力的能力不可小觑。数字化乡村建设背景下&#xff0c;数字化信息技术将全面改造升级农村产业&#xff0c;从农业、养殖…

new set数组对象去重失败

我们知道Set是JS的一个种新的数据结构&#xff0c;和数组类似&#xff0c;和数组不同的是它可以去重&#xff0c;比如存入两个1或两个"123"&#xff0c;只有1条数据会存入成功&#xff0c;但有个特殊情况&#xff0c;如果添加到set的值是引用类型&#xff0c;比如数组…

DataGear 4.5.1 发布,数据可视化分析平台

DataGear 4.5.1 发布&#xff0c;严重 BUG 修复&#xff0c;具体更新内容如下&#xff1a; 修复&#xff1a;修复SQL数据集对于DB2、SQLite等数据源预览时会报错的BUG&#xff1b;修复&#xff1a;修复系统对于MySQL、MariaDB等数据源中无符号数值类型有时报错的BUG&#xff1…

借助媛如意让ROS机器人turtlesim画出美丽的曲线-云课版本

首先安装并打开猿如意其次打开蓝桥云课ROS并加入课程在猿如意输入问题得到答案在蓝桥云课ROS验证如何通过turtlesim入门ROS机器人您可以通过以下步骤入门ROS机器人&#xff1a;安装ROS&#xff1a;您需要安装ROS&#xff0c;可以在ROS官网上找到安装指南。安装turtlesim&#x…

英文拼写检查:TX Spell .NET for .NET 10.0 Crack

用于 Windows 窗体应用程序的 TX Text Control .NET 的强大拼写检查和语言工具。 表现 可靠准确的拼写检查 使用 TX Spell .NET for Windows Forms&#xff0c;您可以为基于 TX Text Control 的应用程序添加极其快速、高度可靠和非常准确的拼写检查。将 TX Spell .NET for Wind…

mysql中的共享锁,排他锁,间隙锁,意向锁及死锁机制

一、前言&#xff08;以下均为读完 高性能Mysql第四版 后的个人理解&#xff0c;建议阅读&#xff0c;挺不错的&#xff09;在写锁机制前先简单贴出mysql InnoDB引擎中的事务特性与隔离级别&#xff1a;事务的ACID标准(1)原子性-atomicity&#xff1a;一个事务作为一个不可分割…

vue中使用富文本Tinymce

本文是直接引用vue-element-admin中的&#xff0c;在此记录方便下次使用&#xff0c;日后再详细注释。 再src下的components下创建Tinymce 下包含以下文件 index.vue是主体文件 plugins.js 是 插件配置 toolbar.js 是 粗体、斜体等配置 EditorImage.vue 是右上角的上传 封装后…

一文速学-GBDT模型算法原理以及实现+Python项目实战

目录 前言 一、GBDT算法概述 1.决策树 2.Boosting 3.梯度提升 使用梯度上升找到最佳参数 二、GBDT算法原理 1.计算原理 2.预测原理 三、实例算法实现 1.模型训练阶段 1&#xff09;初始化弱学习器 2&#xff09;对于建立M棵分类回归树​&#xff1a; 四、Python实现 …

Spring_让Spring 依赖注入彻底废掉

在Spring之基于注解方式实例化BeanDefinition&#xff08;1&#xff09;_chen_yao_kerr的博客-CSDN博客中&#xff0c;我们在末尾处分享了一个甜点&#xff0c;就是关于实现了BeanDefinitionRegistryPostProcessor也可以实例化bean的操作&#xff0c;首先需要去了解一下那篇博客…

宝塔(二):升级JDK版本

目录 背景 一、下载JDK17 二、配置环境变量 三、配置新的JDK路径 背景 宝塔的软件商店只有JDK8&#xff0c;不满足我当前项目所需的JDK版本&#xff0c;因此想对JDK版本进行升级&#xff0c;升级为JDK17。 一、下载JDK17 先进入 /usr/lib/jvm 目录 点击终端&#xff0c;进…

OpenCV——line、circle、rectangle、ellipse、polylines函数的使用和绘制文本putText函数以及绘制中文的方法。

学习OpenCV的过程中&#xff0c;画图是不可避免的&#xff0c;本篇文章旨在介绍OpenCV中与画图相关的基础函数。 1、画线条——line()函数 介绍&#xff1a; cv2.line(image, start_point, end_point, color, thickness)参数&#xff1a; image: 图像start_point&#xff1a…

拉链表(小记)

拉链表创建外部表将编写的orders.txt上传到hdfs创建一个增减分区表将orders表的数据传入ods_orders_inc查看分区创建历史表插入数据操作创建外部表 create database lalian; use lalian;create external table orders(orderId int,createDate string,modifiedTime string,stat…

Redis集群方案应该怎么做?

今天我们来跟大家唠一唠JAVA核心技术-RedisRedis是一款流行的内存数据库&#xff0c;适用于高性能的数据缓存和实时数据处理。当需要处理大量数据时&#xff0c;可以使用Redis集群来提高性能和可用性。Redis在单节点模式下&#xff0c;虽然可以支持高并发、快速读写、丰富的数据…

sizeof与一维数组和二维数组

&#x1f355;博客主页&#xff1a;️自信不孤单 &#x1f36c;文章专栏&#xff1a;C语言 &#x1f35a;代码仓库&#xff1a;破浪晓梦 &#x1f36d;欢迎关注&#xff1a;欢迎大家点赞收藏关注 sizeof与一维数组和二维数组 文章目录sizeof与一维数组和二维数组前言1. sizeof与…