禹神:三小时快速上手TypeScript,TS速通教程(上篇、中篇、下篇,3合1笔记),根据视频整理

news2025/2/26 2:27:04

TypeScript快速上手

📚一、TypeScript简介

TypeScript与JavaScript的关系图
1.TypeScript由微软开发,是其于JavaScript的一个扩展语言.
2.TypeScript包含了JavaScript的所有内容,即:TypeScript是JavaScript的超集
3.TypeScript增加了:静态奖型检查、接口、泛型等很多现代开发特性,因此吏适合大型项目的开发。
4.TypeScript需要编译为JavaScript,然后交给浏览器成其他JavaScript运行环境执行

📚二、为何需要ypeScript

1️⃣今非昔比的JavaScript(了解)

  • JavaScript当年诞生时的定位是浏览器脚本语言,用于在网页中嵌入一些简单的逻辑而且代码量很少.
  • 随着时间的推移,JavaScript变得越来越流行,如今的JavaScript已经可以全栈编程了.
  • 现如今的JavaScript应用场景比当年丰富的多,代码量也比当年很多,随便一个JavaScript项目的代码量,可以轻松的达到几万行,甚至十几万行1
  • 然而JavaScript当年出生简陋,没考虑到如今的应用场景和代码量,逐渐的就出现了很多困扰

2️⃣JavaScript中的困扰
😔1,不清不楚的数据类型

let welcome = 'hello'
welcome()/此行报错:TypeError:welcome is not a function

😔2.有漏涧的逻辑

const str = Date.now() % 2 ? '奇数' : '偶数'
if (str !== '奇数') {
  alert('hello')
} else if (str === '偶数') {
  alert('world')
}

😔3.访问不存在的属性

const obj = {width:10,height:15 }
const area = obj.width * obj.heigth;

😔4.低级的拼写错误

const message ='hello,world'
message.toupercase()

3️⃣『静态类型检查』

  • 在代码运行前进行检查,发现代码的错误或不合理之处,减小运行时异常的出现的几率,此种检查叫『静态类型检查』,TypeScript和核心就是『静态类型检查』,简言之就是把运行时的错误前置
  • 同样的功能,TypeScript的代码量要大于JavaScript,但由于TypeScript的代码结构更加清晰,在后期代码的维护中TypeScript却远胜于JavaScript。.

📚三、编译TypeScript

浏览器不能直接运行TypeScript代码,需要编译为JavaScript再交由浏览器解析器执行。

🔖1.命令行编译

要把.ts文件编译为.js文件,需要配置TypeScript的编译环境,步骤如下:

  • 第一步:创建一个demo.ts文件,例如:
const person = {
  name: '李四',
  age: 18
}

console.log(`我叫${person.name},我今年${person.age}岁了`)
  • 第二步:全局安装TypeScript
npm i typescript -g
  • 第三步:使用命令编译.ts文件
tsc demo.ts

🔖2.自动化编译

  • 第一步:创建TypeScript编译控制文件
tsc --init

解释

  • 第二步:监视目录中的.ts文件变化
tsc --watch
  • 第三步:小优化,当编译出错时不生成.js文件
tsc --noEmitonError --watch

备注

📚四、类型声明

使用:来对变量函数形参,进行类型声明:

let a:string     //变量a只能存储字符串
let b:number     //变量b只能存储数值
let c:boolean    //变量c只能存储布尔值
a = 'hello'
a = 100          //警告:不能将类型“number'”分配给类型“string”

b = 666
b = '你好'       //警告:不能将类型“string”分配给类型“number'”

c = true
c = 666         //警制:不能将类型“number”分配给类型“boolean”

//参数x必须是数字,参数y也必须是数字,函数返回值也必须是数字
function demo(x:number,y:number):number{
  return x + y
}
  demo(100,200)
  demo(100,'200')        //警告:类型“string”的参数不能赋给类型“number”的参数
  demo(100,200,300)      //警告:应有2个参数,但获得3个
  demo(100)              //警告:应有2个参数,但获得1个

:后也可以写字面量类型,不过实际开发中用的不多

1et a:'你好'  //a的值只能为字符串“你好”
1et b:100    //b的值只能为数字180
a = '欢迎'   //警告:不能将类型"欢迎"”分配给类型"你好"”
b = 200     //警告:不能将类型“200”分配给类型“100”

📚五、类型推断

描述

📚六、类型总览

描述
描述
描述

let str1:string
str1 = 'hello'
str1 = new String('hello')    //报错
let str2:String
str2 = 'hello'
str2 = new String('hello')
console.log(typeof str1)
console.log(typeof str2)

描述

//原始类型字符串
let str = 'hello';
//当访问str.length时,Javascript引擎做了以下工作:
let size = (function () {
    //1.自动装箱:创建一个临时的string对象包装原始字符串
    let tempstringobject = new String(str);

    //2.访问String对象的length,属性
    let lengthvalue = tempstringobject.length;
    //3,销毁临时对象,返回长度值
    //(JavaScript引擎自动处理对象销毁,开发者无感知)
    return lengthvalue;
})()
console.log(size); //输出: 5

📚七、常用类型

🔖1.any

描述

//明确的表示a的类型是any   一   【显式的any】
let a: any
//以下对a的赋值,均无警告
a = 100
a = '你好'
a = false

//没有明确的表示b的类型是any,但TS主动推断出来b是any  一  隐式的any
let b
//以下对b的赋值,均无警告
b = 100
b = '你好'
b = false

描述

/*注意点:ay类型的变量,可以赋值给任意类型的变童*/
let c: any
c = 9
let x: string
x = c  //无警告

🔖2.unknown

描述

//设置a的类型为unknown
let a: unknown

//以下对a的赋值,均正常
a = 100
a = false
a = '你好'

// 设置x的数据类型为string
let x: string
x = a//警告:不能将类型“unknown'”分配给类型“string”

描述

// 设置a的类型为unknown
let a: unknown
a = 'hello'

// 第一种方式:加类型判断
if (typeof a === 'string') {
    x = a
    console.log(x)
}

// 第二种方式:加断言
x = a as string

//第三种方式:加断言
x = <string>a

描述

let str1: string
str1 = 'hello'
str1.toUppercase()  //无警告

let str2: any
str2 = 'hello'
str2.toUpperCase()  //无警告

let str3: unknown
str3 = 'hello';
str3.toUpperCase();  //警告:“str3”的类型为“未知”
    
// 使用断言强制指定str3的类型为string
(str3 as string).toUpperCase()//无警告

🔖3.never

描述

/*指定a的类型为never,那就意味着a以后不能存任何的数据了*/
let a: never

//以下对a的所有赋值都会有警告
a = 1
a = true
a = undefined
a = null

描述

//指定a的类型为string
let a:string
//给a设置一个值
a = 'hello'

if (typeof a ==='string') {
    console.log(a.toUppercase())
}else{
    console.log(a) //Typescript会推断出此处的a是never,因为没有任何一个值符合此处的逻辑
}

描述

//限制throwErrori函数不需要有任何返回值,任何值都不行,像undeifned、null都不行
function throwError(str: string): never {
    throw new Error('程序异常退出:' + str)
}

🔖4.void

描述
描述

function logMessage(msg:string):void{
console.log(msg)
}
logMessage('你好')

描述

//无警告
function logMessage(msg: string): void {
    console.log(msg)
}

//无警告
function logMessage2(msg: string): void {
    console.log(msg)
    return;
}

//无警告
function logMessage3(msg: string): void {
    console.log(msg)
    return undefined
}

描述

function logMessage(msg: string): void {
    console.log(msg)
}

let result = logMessage('你好')

if (result) { //此行报错:无法测试"void"类型的表达式的真实性
    console.log('logMessage有返▣值')
}
function logMessage(msg: string): undefined {
    console.log(msg)
}

let result = logMessage('你好')

if (result) {  //此行无警告
    console.log('logMessage?有返回值')
}

描述

🔖5.object

🔖🔖object(小写)

描述

let a:object  //a的值可以是任何【非原始类型】,包括:对象、函数、数组等

//以下代码,是将【非原始类型】赋给a,所以均符合要求
a = {}
a = {name: '张三'}
a = [1, 3, 5, 7, 9]
a = function () {}
a = new String('123')
class Person {}
a = new Person() 

//以下代码,是将【原始类型】赋给a,有警告
a = 1           //警告:不能将类型“number”分配给类型“object”
a = true        //警告:不能将类型boolean'”分配给类型“object'
a = '你好'       //警告:不能将类型“string”分配给类型“object'”
a = null        //警告:不能将类型“nul1”分配给类型“object”
a = undefined   //警告:不能将类型“undefined”分配给类型“object”

🔖🔖Object(大写)

描述

let b: Object //b的值必须是Object的实例象(像法undefined和nul1的任何值)

//以下代同,均关警否,因为格就的值,都是0bCct的实例对参
b = {}
b = {name: '张三'}
b = [1, 3, 5, 7, 9]
b = function () {}
b = new String('123')
class Person {}
b = new Person()
b = 1            //1不是陆0t的实刷对象,国风想装对象是Object的实例
b = true         //true不是Object的实例对象,但其在钻对整是Object的实例
b = '你好'        //“你好”不是Object的实例对象,阳其随酒象是Object的实例

//以下代码均有警告
b = null     //警告:不能将类型“nu11”分配给类型“object”
b=undefined  //警告:不能将类型“undefined”分配给类型“object”

🔖🔖声明对象类型

描述
描述

🔖🔖声明函数类型

描述

🔖🔖声明数组类型

描述

🔖6.tuple

描述

🔖7.enum

描述
描述
描述
描述
描述

描述
编译后生成的JavaScript代码量较大:

"use strict";
var Directions;
(function (Directions) {
  Directions[Directions["Up"] = 0] = "Up";
  Directions[Directions["Down"] = 1] = "Down";
  Directions[Directions["Left"] = 2] = "Left";
  Directions[Directions["Right"] = 3] = "Right";
})(Directions || (Directions = {}))
let x = Directions.Up;

使用常量枚举的TypeScript代码如下:

const enum Directions {
    Up,
    Down,
    Left,
    Right
}

let x = Directions.Up;

编译后生成的JavaScript代码量较小:

"use strict";
let x = 0 /* Directions.Up */

🔖8.type

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🔖9.一个特殊情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
官方文档的说明:👉Assignability of Functions

🔖10.复习类相关知识

本小节是复习类相关知识,如果有相关基础可以跳过

类 class,Person类

class Person {
    //属性声明
    name: string
    age: number

    //构造器
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }

    //方法
    speak() {
        console.log(`我叫:${this.name},今年${this.age}`)
    }
}

//Person实圆
const p1 = new Person('周杰伦', 38)

Student继承Person

class Student extends Person {
    grade: string

//构造器
    constructor(name: string, age: number, grade: string) {
        super(name, age)
        this.grade = grade
    }

//备注本例中若Student:类不需要额外的属性,Student的构造器可以省略
//重写从父类继承的方法
    override speak() {
        console.log(`我是学生,我叫:${this.name},今年${this.age}岁,在读${this.grade}年级`)
    }

//子类自己的方法
    study() {
        console.log(`{this.name}正在努力学习中....`)
    }
}

🔖11.属性修饰符

描述

🔖🔖public修饰符

class Person {
    //name写了public修饰符,age没写修饰符,最终都是public修饰符
    public name: string
    age: number

   
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }

   
    speak() {
    	// 类的【内部】可以访问public修饰的name和age
        console.log(`我叫:${this.name},今年${this.age}`)
    }
}

const p1 = new Person('周杰伦', 38)
//类前【外部】可以访问public修饰的属性
console.log(p1.name)

🔖🔖属性的简写形式

描述

简写前

描述

简写后

描述

🔖🔖protected修饰符

描述

🔖🔖private饱饰符

描述
这个图片下面还有一点没有截到。

🔖🔖readonly修饰符

描述
这个图片下面还有一点没有截到。

🔖12.抽象类

描述
描述

🔖13.interface

描述

🔖🔖定义类结构

描述

🔖🔖定义对象结构

描述

🔖🔖定义函数结构

描述

🔖🔖接口之间的继承

描述

🔖🔖接口自动合并(可重复定义)和总结

描述

🔖14,一些相似概念的区别

🔖🔖14.1.interface与type的区别

描述
描述
描述
描述

🔖🔖14.2,interface与抽象类的区别

描述
描述

📚八、自定义类型

描述
描述
描述
描述
描述
描述

📚九、类型声明文件

描述
描述
描述

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

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

相关文章

Win10安装ChatTTS-2024-cuda10.1

0x00 前言 ChatTTS是专门为对话场景设计的文本转语音模型&#xff0c;例如大语言助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。目前在huggingface中的开源版本为4万小时训练且未SFT的版本。 0x01 准备环境 版本操作系统Win1…

大模型参数高效微调技术总结

基础知识 最近&#xff0c;OpenAI推出的ChatGPT展现出了卓越的性能&#xff0c;引发了大规模语言模型(Large Language Model, LLM)的研究热潮。大规模语言模型的“大”体现在两个方面&#xff1a;模型参数规模大&#xff0c;训练数据规模大。以GPT3为例&#xff0c;GPT3的参数…

springboot集成redis之接口缓存

什么是redis的接口缓存&#xff1f; Redis的接口缓存是一种利用Redis这种内存数据库来存储接口&#xff08;API&#xff09;响应数据的技术&#xff0c;以提高应用程序的响应速度和性能。具体来说&#xff0c;当用户请求一个接口时&#xff0c;系统会首先检查Redis缓存中是否已…

windows vs2022 MFC使用webview2嵌入网页

Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎&#xff0c;以在本机应用中显示 web 内容。 一、通过菜单“项目”-“管理NuGet程序包”&#xff0c;下载相关包 二、安装 Microsof…

windows ssh launch Jenkins

一、 windows server2012 ssh launch jenkins 经过一系列测试验证发现&#xff0c;windows server2012始终无法launch到jenkins master。配置ssh之后 [08/21/24 10:08:03] [SSH] Opening SSH connection to 172.xx.xx.xx:18822. [08/21/24 10:08:03] [SSH] WARNING: SSH Host …

DBeaver连接GBase 8s数据库的步骤

最近在学习国产数据库GBase 8s。酷酷一顿操作后&#xff0c;发现自带的 dbaccess 不好用&#xff0c;然后尝试用DBeaver这种图形界面来尝试使用。 本次使用工具&#xff1a; 1、dbeaver-ce-24.1.4 2、GBase 8s Server 8.8 一、搭建环境&#xff0c;官方建议使用的是CentOS 7.3&…

vue 实现批量引入组件

批量引入组件 1.目录示例2.被引入组件示例3.全局注册方法3.1.require.context() 是什么3.2.require.context() 用法 4.使用全局注册方法5.使用 1.目录示例 2.被引入组件示例 注意&#xff1a;必须要有name <template><div>Hkmxdy</div> </template> &l…

【学习笔记】Day 21

一、进度概述 1、机器学习常识19-22&#xff0c;以及相关代码复现 二、详情 19、矩阵分解 矩阵分解是一个纯数学问题&#xff0c;但当给矩阵赋予现实意义后&#xff0c;矩阵分解就成为了使用数学应对机器学习问题的一类典型而巧妙的方法。 在线性回归分析中&#xff…

PaddleNLP 3.0 支持大语言模型开发

huggingface不支持模型并行。张量并行&#xff0c;不满足大规模预训练的需求。 1、组网部分 2、数据流 3、训练器 4、异步高效的模型存储

CV每日论文--2024.7.25

1、Diffusion Models for Monocular Depth Estimation: Overcoming Challenging Conditions 中文标题&#xff1a;单目深度估计的扩散模型&#xff1a;克服具有挑战性的条件 简介&#xff1a;本文提出了一种新颖的方法,旨在解决单张图像深度估计任务中具有挑战性的、超出分布范…

java设计模式--结构型模式

结构性模式&#xff1a;适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09; 充当两个不兼容接口之间的桥梁&#xff0c;属于结构型设计模式。目的是将一个类的接口转换为另一个接口&am…

Numba加速计算(CPU + GPU + prange)

文章目录 加速方法&#xff1a;Numba、CuPy、PyTorch、PyCUDA、Dask、Rapids一、Numba简介二、Numba类型&#xff1a;CPU GPU三、项目实战 —— 数组的每个元素加23.1、使用 python - range 循环计算 —— &#xff08;时耗&#xff1a;137.37 秒&#xff09;3.2、使用 python…

天空卫士五载出海路:让国际数据安全舞台,有我们的身影

在全球化和“一带一路”倡议的推动下&#xff0c;中国企业正加速出海&#xff0c;探索新的增长机会。中国联通联合天空卫士等合作伙伴&#xff0c;推出“安全产业链联合出海计划”&#xff0c;旨在汇聚资源&#xff0c;打造国家级网络安全产业平台&#xff0c;推动出海业务的发…

C# 必备技能—项目打包

目录 前言 准备工作 第一步 第二步 第三步 扩展 总结 最后 前言 在C#开发中&#xff0c;项目打包是一个重要的环节&#xff0c;将你的应用程序及其依赖项组织成一个或多个可以在目标系统上安装和运行的包。 这对于发布应用程序至关重要&#xff0c;因为它确保了最终用…

快9月才开强化❓张宇36讲+1000题速刷指南

很多同学问&#xff0c;基础跟的是张宇老师&#xff0c;但是感觉25版张宇36讲太厚&#xff0c;可不可以不看&#xff0c;换其他老师 当然可以&#xff0c;但是如果你基础跟的是张宇老师&#xff0c;那强化阶段换成其他老师&#xff0c;可能会重复听一些内容&#xff0c;造成时…

手机APP应用移动端身份证识别技术,实现扫描录入身份信息

随着移动互联网的的发展&#xff0c;越来越多的公司都推出了自己的手机APP&#xff0c;这些APP多数都涉及到个人身份证信息的输入认证&#xff08;即实名认证&#xff09;&#xff0c;如果手动去输入身份证号码和姓名&#xff0c;速度非常慢&#xff0c;且用户体验非常差。为了…

Godot《躲避小兵》实战之游戏开始界面制作

我们的游戏还需要用户可操作的界面&#xff0c;比如开始游戏&#xff0c;退出以及显示分数等UI界面。 创建新场景&#xff0c;点击“其他节点”按钮&#xff0c;然后添加一个 CanvasLayer 节点并命名为 HUD。“HUD”是“heads-up display”&#xff08;游戏信息显示&#xff0…

2055. 欧拉路

代码 #include<bits/stdc.h> using namespace std; int n,e,a[35][35],d[35],r[55],k0; void dfs(int x) {for(int i1;i<n;i){if(a[x][i]1){a[x][i]0;a[i][x]0;dfs(i);}}k;r[k]x; } int main() {int x,y,i,s1;cin>>n>>e;for(i1;i<e;i){cin>>x&g…

TCP协议中的三次握手

WHAT&#xff1a;什么是三次握手&#xff1f; 建立TCP需要三次握手才能建立&#xff0c;而断开连接则需要四次挥手。 TCP链接是全双工的&#xff0c; 因此每个方向上都必须要关闭 三次握手一定是B向S发起&#xff0c;但是四次挥手可以是B向S也可以是S向B发起的 比如&#xff1a…

【中仕公考怎么样】公务员行测考什么内容?

行政职业能力测验&#xff0c;也就是我们常说的“行测”。是公务员考试笔试环节中的核心科目&#xff0c;占据总成绩的50%。主要考察考生在言语理解与表达、数量关系、判断推理、资料分析和常识判断方面的能力。 国考行测分为副省级、地市级以及行政执法类&#xff0c;题目数量…