TS学习与实践

文章目录

  • 学习资料
  • TypeScript 介绍
    • TypeScript 是什么?
    • TypeScript 增加了什么?
    • TypeScript 开发环境搭建
  • 基本类型
  • 编译选项
    • 声明
    • 属性
    • 属性修饰符
    • getter 与 setter
    • 方法
      • static 静态方法
      • 实例方法
    • 构造函数
    • 继承 与 super
    • 抽象类
    • 接口
      • interface 定义接口
      • implements 使用接口
      • 多重继承
    • 泛型


学习资料

【尚硅谷TypeScript教程(李立超老师TS新课)】

TypeScript演练场

TypeScript 介绍

TypeScript 是什么?

在这里插入图片描述

TypeScript 增加了什么?

在这里插入图片描述

TypeScript 开发环境搭建

  1. 下载Node.js https://nodejs.com.cn/
  2. 安装Node.js
  3. 使用npm全局安装typescript
    • 进入命令行
    • 输入:npm i -g typescript
  4. 创建一个ts文件
  5. 使用tscts文件进行编译
    • 进入命令行
    • 进入ts文件所在目录
    • 执行命令:tsc 文件名.ts

基本类型

  • 类型声明

    • 类型的声明是TS非常重要的一个特点
    • 通过类型声明可以指定TS中的变量(参数、形参)的类型
    • 指定类型后,当为变量赋值时,TS编译器会自动检查是否符合类型声明,符合则赋值,否则报错
    • 简而言之,类型声明给变量设置了类型,使得变量只能存储某种类型的值
    • 语法:
      let 变量: 类型;let 变量: 类型 =;function fn(参数:类型, 参数:类型): 类型{...
      }
      
  • 自定类型判断

    • TS拥有自动的类型判断机制
    • 当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型
    • 所以如果你的变量的声明和赋值是同时进行的,可以省略掉类型声明
  • 类型

    类型例子描述
    number1, -33, 2.5任意数字
    string‘hi’, “hi”任意字符串
    booleantrue、false布尔值true 或 false
    字面量其本身限制变量的值就是该字面量的值
    any*任意类型
    unknown*类型安全的any
    void空(undefined)没有值(或 undefined)
    never没有值不能是任何值
    object{name:‘孙悟空’}任意的JS对象
    array[1,2,3]任意JS数组
    tuple[4,5]元素,TS新增类型,固定长度数组
    enumenum{A,B}枚举,TS中新增类型
  • number

    let decimal: number = 6;
    let hex: number = 0xf00d;
    let binary: number = 0b1010;
    let octal: number = 0o744;
    let big: bigint = 100n;
    
  • boolean

    let isDone: boolean = false;
    
  • string

    let color: string = "blue";
    color = 'red';let fullName: string = `Bob Bobington`;
    let age: number = 37;
    let sentence: string = `Hello, my name is ${fullName}.I ll be ${age +1} years old next month.`
  • 字面量
    也可以使用字面量去指定变量的类型,通过字面量可以确定变量的取值范围

    let color: 'red' | 'blue' | 'black';
    let num: 1 | 2 | 3 | 4 | 5;
    
  • any

    let d: any = 4;
    d = 'hello';
    d == true;
    
  • unknown

    let notSure: unknown = 4;
    notSure = 'hello';
    
  • void

    let unsable: void = undefined;
    
  • never

    function error(message: string): never {throw new Error(message);
    }
    
  • object(没啥用)

    let obj: object = {};
    
  • array

    let list: number[] = [1,2,3];
    let list: Array<number> = [1,2,3];
    
  • tuple

    let x: [string, number];
    x = ["hello",10];
    
  • enum

    enum Color {Red,Green,Blue
    }
    let c: Color = Color.Green;enum Color {Red = 1,Green = 2,Blue = 4
    }
    let c: Color = Color.Green;
    
  • 类型断言

    • 有些情况下,变量的类型对于我们来说是很明确,但是TS编译器却不清楚,此时,可以通过类型断言来告诉编译器变量的类型,断言有两种形式:
      • 第一种
        let someValue: unknown = "this is a string";
        let strLength: number = (someValue as string).length;
        
      • 第二种
        let someValue: unknown = "this is a string";
        let strLength: number = (<string>someValue).length;
        

编译选项

  • 自动编译文件
    • 编译文件时,使用-w指令后,TS编译器会自动监视文件的变化,并在文件发生变化时对文件进行重新编译。
    • 示例:
      • tsc xxx.ts -w
  • 自动编译整个项目
    • 如果直接使用tsc指令,则可以自动将当前项目下的所有ts文件编译为js文件。
    • 但是能直接使用tsc指令的前提是,要先在项目目录下创建一个ts的配置文件tsconfig.json
    • tsconfig.json是一个JSON文件,添加配置文件后(添加配置文件命令,在VSCode终端中输入tsc -init),只需要tsc指令即可完成对整个项目的编译。
    • 配置选项:
      • include
        • 定义希望被编译文件所在的目录
        • 默认值:[**/*]
        • 示例:
          "include":["src/**/*","tests/**/*"]
          
          上述例子中,所有src目录和tests目录下的文件都会被编译
      • exclude
        • 定义需要排除在外的目录
        • 默认值:["node_modules","bower_components","jspm_packages"]
        • 示例:
          "exclude": ["./src/hello/**/*"]
          
          上述示例中,src和hello目录下的文件都不会被编译
      • extends【了解即可】
        • 定义被继承的配置文件
        • 示例:
          • "extends": "./configs/base"
            上述示例中,当前配置文件会自动包含config目录下base.json中所有配置信息
      • files【了解即可】
        • 指定被编译文件的列表,只需要编译的文件少时才会用到
        • 示例:
          "files": ["core.ts","sys.ts","types.ts"
          ]
          
          列表中的文件都会被TS编译器所编译
      • compilerOptions(重点,以下为compilerOptions的子选项)
        • 编译器的选项
          		{"compilerOptions": {"target": "ES6","module": "system","outDir": "./dist",// "outFile": "./dist/app.js","allowJs": false,"checkJs": false,"removeComments": false,"noEmit": false,"noEmitOnError": true,"strict": true,"alwaysStrict": true,"noImplicitAny": false,"noImplicitThis": true,"strictNullChecks": true} }
          
        • target
          • 用来指定ts被编译为的es版本
          • 可选项:ES3(默认)、ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext
        • module
          指定要使用的模块化的规范
          'none', 'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'es2022', 'esnext', 'node16', 'nodenext'.
          
        • lib
          用来指定所需要的库,一般不用动,有默认值
          可选项:‘es5’, ‘es6’, ‘es2015’, ‘es7’, ‘es2016’, ‘es2017’, ‘es2018’, ‘es2019’, ‘es2020’, ‘es2021’, ‘esnext’, ‘dom’, ‘dom.iterable’, ‘webworker’, ‘webworker.importscripts’, ‘webworker.iterable’, ‘scripthost’, ‘es2015.core’, ‘es2015.collection’, ‘es2015.generator’, ‘es2015.iterable’, ‘es2015.promise’, ‘es2015.proxy’, ‘es2015.reflect’, ‘es2015.symbol’…
          
        • outDir
          • 用来指定编译后文件所在的目录
          "outDir": "./dist"
          
        • outFile
          将代码合并成一个文件,设置outFile后,所有的全局作用域合并在一个文件中,module中只有’amd’‘system’ 支持outFile
          "outFile": "./dist/app.js"
          
        • allowJs
          是否对js文件进行编译,默认是false,如果项目中某些模块用js写,可能需要编译
          "allowJs": false
          
        • checkJs
          检查js是否符合语法规范,默认是false
          "checkJs": false
          
        • removeComments
          是否移除注释,默认是false
          "removeComments": true
          
        • noEmit
          不生成编译后的文件,默认是false
           "noEmit": true
          
        • noEmitOnError
          当有错误时不生成编译后的文件,默认是false
          "noEmitOnError": false
          
        • strict
          所有严格模式的总开关,默认false(配置后相当于以下配置全都开启)
          "strict": true
          
        • alwaysStrict
          用来设置编译后的文件是否适用于严格模式,默认是false
          "alwaysStrict": true
          
        • noImplicitAny
          当某个变量不指定类型时,使用any类型
          "noImplicitAny": true
          
        • noImplicitThis
          不允许类型不明的 this
          "noImplicitThis": true
          
        • strictNullChecks
          严格地检查空值,默认false
          "strictNullChecks": true
          

声明

用关键字class来声明一个类

class Person{...
}

属性

在TS中类的属性一共有三种,在属性面前添加相应的修饰符便可

class Person{name:string = "zhubajie" // 实例属性static age = 89 // 类属性readonly addr:string = "高老庄" // 只读属性
}
  • 实例属性
    直接定义的属性属于实例属性
    他必须通过类实例化之后才能使用
  • 类属性
    static开头的属性为类属性
    他可以通过类直接访问Person.age
  • 只读属性
    readonly定义的属性为只读属性,不可修改
    readonly也可以放再static后面

属性修饰符

pubilc 公共属性,可以再任意位置访问和修改(实例属性,实例化之后访问)
private 私有属性,只能在类的内部进行访问和修改(一般声明的时候我们会以_开头)
protected 受保护的属性,只能在当前类和当前类的子类中进行访问

class Person{public name = "SunWuKong"private age = 30protected sex = "male"
}const person = new Person()
console.log(person.name)
console.log(person.age) // 错误 只能在Person这个类中进行访问
console.log(person.sex)  // 错误 只能在Person这个类和其子类中访问

此外,还有readOnly属性,以他修饰的属性只能读取不能修改

getter 与 setter

  • 类中的每一个属性内置getter方法和setter方法
    getter 方法用于获取属性
    setter 方法用于设置属性
  • 这样,我们可以对属性读取和操作做一些拦截,设置如下
    class Person1{private _name:stringconstructor(name:string){this._name = name;}set name(value:string){this._name = value}get name(){return this._name}
    }
    
    当我们进行读取的时候,其实是走的get这个逻辑
    当我们对于属性进行赋值的时候,其实是走的set这个逻辑

方法

static 静态方法

经过static关键字修饰的方法属于类方法,可以通过类直接使用

class BaJie{name = "BaJie"static age = 18static sayName(){console.log("八戒")}
}// 通过类直接访问
BaJie.sayName()
console.log(BaJie.age);const bajie = new BaJie()
bajie.sayName() // 实例化之后不可访问

当有不规范的语法的时候,ts就不会进行编译,如上面的编译如下

var BaJie = /** @class */ (function () {function BaJie() {this.name = "BaJie";}BaJie.sayName = function () {console.log("八戒");};BaJie.age = 18;return BaJie;
}());
// 通过类直接访问
BaJie.sayName();
console.log(BaJie.age);

实例方法

在类中直接定义的方法为实例方法,没有任何关键字的修饰

这种方法只能在类实例化之后进行使用

class BaJie{name = "BaJie"age = 18sayName(){console.log("八戒")}
}// 通过类直接访问
BaJie.sayName() // 错误的访问方法
console.log(BaJie.age); // 错误的访问方法
// 同样,实例化之后也是可以访问的
const bajie = new BaJie()
bajie.sayName() 
console.log(bajie.name);

构造函数

class Person{name:string;age:nubmer;constructor(name:string,age:number){this.name = namethis.age = age}
}const p1 = new Person('张三',18);
const p2 = new Person('李四',20);console.log(p1);
console.log(p2);

constructor被称为构造函数
构造函数会在对象创建时调用

继承 与 super

// 父类
class Animal{name:string;age: number;constructor(name:string,age:number){this.name = name;this.age = age}sayName(){console.log(this.name)}
}
// 子类
class Dog extends Animal{run(){console.log(`${this.name}run`);}
}
class Cat extends Animal{sayName(){console.log(`我是${this.name}`);}
}
const dog = new Dog("旺财",19)
const cat = new Cat("汤姆",20)
dog.sayName()
dog.run()
cat.sayName()

可以将代码复制到 TypeScript演练场 运行

在这里插入图片描述
我们使用extends关键字来进行继承,其中被继承的Animal为父类,Dog为子类
继承之后,子类会拥有父类的一切属性和方法
子类也可以自己定义一些方法,如上面例子中的run
子类也可以写与父类相同的方法,这样执行方法的时候会执行子类的方法,叫做方法重写Cat类中重写了sayName方法)

抽象类

abstract class Animal{name:string;constructor(name:string){this.name = name;}abstract sayName():void;
}class Dog extends Animal{age:number;constructor(name:string,age:number){super(name);this.age = age;}sayName(): void {console.log(`我是${this.name},我今年${this.age}岁了`);}
}const dog = new Dog("旺财",23)
dog.sayName() // 我是旺财,我今年23岁了

abstract关键字来定义抽象类和抽象方法

  • 抽象类
    抽象类不能用来创建对象
    抽象类只能用于继承(说明类中有哪些属性,哪些方法)
    在抽象类中可以添加抽象方法(如sayName方法)
  • 抽象方法
    抽象方法没有方法体(如sayName方法),且只能定义在抽象类中
    子类必须对于抽象类中的抽象方法进行复写

接口

接口用于描述一个类或者一个对象的结构,描述他们的属性和方法,所以接口可以当做一个类的声明

interface 定义接口

我们使用interface来定义一个接口,定义的方法全部为抽象方法,必须重写

接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法

同时接口也可以当成类型声明去使用

interface myInterface{name:string,age:number,sex:"male"|"female",sayName():void
}

implements 使用接口

一般我们使用implements关键字来使用接口

class Person implements myInterface{name: string;age: number;sex: "male" | "female";sayName(): void {console.log(this.name);}
}

多重继承

使用extends来进行接口的继承,且后可以跟多个接口,实现多重继承

interface Obj {[propName:string]:any
}interface myInterface{name:string,age:number
}interface IPerson extends myInterface,Obj{sex:"male"|"female",sayName():void
}class Person implements IPerson{name: string;age: number;sex: "male" | "female";hobby:"read"|"write"sayName(): void {console.log(this.name);}
}

泛型

在指定函数或者类的时候,如果遇到类型不明确的话,就可以使用泛型(不先指定类型,使用的时候进行类型的转换)

一般在声明的变量后面加一个尖括号来声明泛型
在这里插入图片描述
当我们进行类型转换后,编辑器就会有相应的提示

当然我们也可以不指定泛型,ts会进行自动的类型转换

  • 指定多个泛型
    function fn1<T,K>(a:T,b:K):K{console.log(a);return b
    }fn1<number,string>(1,'hello')
    
  • 定义类
    class Person3<T>{name:Tconstructor(name:T){this.name = name}
    }const person4 =  new Person3<string>("Jack")
    console.log(person.name);
    
  • 泛型与接口
    泛型也可以继承接口,使用extends关键字,他表示泛型必须满足接口的条件
    interface IPerson1{name:string,age:number
    }function fn2<T extends NameInterface>(a:T):string{return a.name
    }fn2<IPerson1>({name:"小敏",age:10})
    

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

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

相关文章

C++笔记之regex(正则表达式)

C++笔记之regex(正则表达式) ——2024-02-10 ——《C++标准库》(第2版,侯捷译) Page 717 code review! 文章目录 C++笔记之regex(正则表达式)例1:使用正则表达式进行搜索(`std::regex_search`)例2:使用正则表达式进行全文匹配(`std::regex_match`)例3:使用正则表达式…

文件包含漏洞的应用与绕过技巧、防御方法

目录 包含日志文件 包含session 绕过技巧 指定前缀绕过 一、目录遍历 二、编码绕过 指定后缀绕过 一、利用URL 二、利用协议 三、长度截断 四、%00截断 文件包含漏洞防御 上一篇文章和大家介绍了一下文件包含漏洞和PHP伪协议的基本知识和利用PHP伪协议进行文件包含…

Java 内存区域介绍

&#xff08;1&#xff09;程序计数器 程序计数器主要有两个作用&#xff1a; 字节码解释器通过改变程序计数器来依次读取指令&#xff0c;从而实现代码的流程控制&#xff0c;如&#xff1a;顺序执行、选择、循环、异常处理。 在多线程的情况下&#xff0c;程序计数器用于记录…

《剑指 Offer》专项突破版 - 面试题 38、39 和 40 : 通过三道面试题详解单调栈(C++ 实现)

目录 面试题 38 : 每日温度 面试题 39 : 直方图最大矩形面积 方法一、暴力求解 方法二、递归求解 方法三、单调栈法 面试题 40 : 矩阵中的最大矩形 面试题 38 : 每日温度 题目&#xff1a; 输入一个数组&#xff0c;它的每个数字是某天的温度。请计算每天需要等几天才会…

力扣[面试题 01.02. 判定是否互为字符重排(哈希表,位图)

Problem: 面试题 01.02. 判定是否互为字符重排 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;哈希表 1.若两个字符串长度不相等&#xff0c;则一定不符合题意&#xff1b; 2.创建一个map集合&#xff0c;先将字符串s1中的每一个字符与其对应的数量存入集合…

【书生·浦语大模型实战营】学习笔记1

大模型成为发展通用人工智能的重要途经 专用模型&#xff1a;针对特定任务&#xff0c;一个模型解决一个问题 通用大模型&#xff1a;一个模型应对多种任务、多种模态 书生浦语大模型系列 上海人工智能实验室 轻量级、中量级、重量级 7B 和 123B的轻量级和中量级大模型都是开源…

Python爬虫——请求库安装

目录 1.打开Anaconda Prompt 创建环境2.安装resuests3.验证是否安装成功4.安装Selenium5.安装ChromeDriver5.1获取chrom的版本5.1.1点击浏览器右上三个点5.1.2点击设置5.1.3下拉菜单&#xff0c;点击最后关于Chrome&#xff0c;获得其版本 5.2 打开网址 [chromedriver](https:/…

树与二叉树---数据结构

树作为一种逻辑结构&#xff0c;同时也是一种分层结构&#xff0c;具有以下两个特点&#xff1a; 1&#xff09;树的根结点没有前驱&#xff0c;除根结点外的所有结点有 且只有一个前驱。 2&#xff09;树中所有结点可以有零个或多个后继。 树结点数据结构 满二叉树和完全二…

GPIO结构

GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平&#xff1a;0V~3.3V,部分引脚可容忍5V 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 输入模式下可读取端口的高低电平或电压&#x…

推荐系统|物品冷启动01_优化目标评价(包括基尼系数)

文章目录 物品冷启动冷启动的类型“新”按常规推送链路的角度按产品生态角度 物品冷启动的目标和评价指标作者侧用户侧 冷启动的衡量 物品冷启动 冷启动的类型 冷启动的内容种类包括很多方面&#xff0c;本文只介绍UGC的冷启动。 所谓UGC&#xff0c;就是User Generate Conte…

Flink cdc debug调试动态变更表结构

文章目录 前言调试流程1. 拉取代码本地打包2. 配置启动参数3. 日志配置4. 启动验证5. 断点验证 问题1. Cannot find factory with identifier "mysql" in the classpath.2.JsonFactory异常3. NoSuchMethodError异常其他 结尾 前言 接着上一篇Flink cdc3.0动态变更表…

tkinter-TinUI-xml实战(10)展示画廊

tkinter-TinUI-xml实战&#xff08;10&#xff09;展示画廊 引言声明文件结构核心代码主界面统一展示控件控件展示界面单一展示已有展示多类展示 最终效果在这里插入图片描述 ![](https://img-blog.csdnimg.cn/direct/286fcaa2fa5648a992a0ac79b4efad82.png) ………… 结语 引言…

【华为云】容灾方案两地三中心实践理论

应用上云之后&#xff0c;如何进行数据可靠性以及业务连续性的保障是非常关键的&#xff0c;通过华为云云上两地三中心方案了解相关方案认证地址&#xff1a;https://connect.huaweicloud.com/courses/learn/course-v1:HuaweiXCBUCNXI057Self-paced/about当前内容为灾备常见理论…

C++:理解拷贝在变量,指针,引用以及构造函数里的意义

变量&#xff0c;指针&#xff0c;引用 //拷贝与拷贝构造函数 //拷贝&#xff08;copy&#xff09;&#xff1a;拷贝数据&#xff0c;拷贝内存 //始终是在拷贝值&#xff0c;但是指针存储的是内存的地址&#xff0c;变量存储的是数据的值 //特别注意&#xff0c;在引用里面的拷…

Mysql Day04

mysql体系结构 连接层服务层引擎层&#xff08;索引&#xff09;存储层 存储引擎 存储引擎是基于表建立的&#xff0c;默认是innoDB show create table tb; 查看当前数据库支持的存储引擎 show engines; InnoDB 特点 DML&#xff08;数据增删改&#xff09;遵循ACID模…

【算法与数据结构】42、LeetCode接雨水

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复…

Modelsim10.4安装

简介&#xff08;了解&#xff0c;可跳过&#xff09; modelsim是Mentor公司开发的优秀的HDL语言仿真软件。 它能提供友好的仿真环境&#xff0c;采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术&#xff0c;编译仿真速…

AI-TestOps —— 软件测试工程师的一把利剑

写在前面软件测试的前世今生测试工具开始盛行AI-TestOps 云平台● AI-TestOps 功能模块● AI-TestOps 自动化测试流程 写在前面 最近偶然间看到一句话&#xff1a;“软件测试是整个 IT 行业中最差的岗位”。这顿时激起了我对软件测试领域的兴趣&#xff0c;虽然之前未涉及过软…

fast.ai 机器学习笔记(二)

机器学习 1&#xff1a;第 5 课 原文&#xff1a;medium.com/hiromi_suenaga/machine-learning-1-lesson-5-df45f0c99618 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这些笔记将继续更…

ASUS华硕灵耀X双屏UX8402V工厂模式原厂Win11.22H2系统安装包,含WinRE恢复出厂时开箱状态自带预装OEM系统

适用型号&#xff1a;UX8402VV、UX8402VU 链接&#xff1a;https://pan.baidu.com/s/1D7tJshKTNFYO4YyzKX0ppQ?pwd3saf 提取码&#xff1a;3saf Zenbook Pro灵耀X笔记本电脑原装出厂Windows11系统 带有ASUS RECOVERY恢复功能、自带面部识别&#xff0c;声卡&#xff0c;网…