TS学习与实践

news2024/11/13 16:18:26

文章目录

  • 学习资料
  • 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 = 30
    protected 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:string
        constructor(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 = 18
    static 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 = 18
    sayName(){
        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 = name
        this.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:T
        constructor(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.coloradmin.cn/o/1441292.html

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

相关文章

git flow与分支管理

git flow与分支管理 一、git flow是什么二、分支管理1、主分支Master2、开发分支Develop3、临时性分支功能分支预发布分支修补bug分支 三、分支管理最佳实践1、分支名义规划2、环境与分支3、分支图 四、git flow缺点 一、git flow是什么 Git 作为一个源码管理系统&#xff0c;…

SQL--事务

事务简介 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 就比如: 张三给李四转账1000块钱&#xff0c;张三银行账户…

适用于 Windows 的 6 款 iPhone 数据恢复软件

数据恢复 已经取得了长足的进步。从仅提供恢复数据的可能性到保证数据恢复&#xff0c;有许多适用于 Windows的第三方 iPhone 数据恢复软件。 大多数软件都是高级工具&#xff0c;但是提供了出色的数据恢复解决方案。从iPhone恢复数据非常简单。 只需将 iPhone 连接到您的计算…

蓝桥杯刷题day08——完全日期

1、题目描述 如果一个日期中年月日的各位数字之和是完全平方数&#xff0c;则称为一个完全日期。 例如&#xff1a;2021年6月5日的各位数字之和为20216516&#xff0c;而16是一个完全平方数&#xff0c;它是4的平方。所以2021年6月5日是一个完全日期。 请问&#xff0c;从200…

计算机毕业设计Python+django医院后勤服务系统flask

结合目前流行的 B/S架构&#xff0c;将医疗后勤服务管理的各个方面都集中到数据库中&#xff0c;以便于用户的需要。该平台在确保平台稳定的前提下&#xff0c;能够实现多功能模块的设计和应用。该平台由管理员功能模块,工作人员模块&#xff0c;患者模块&#xff0c;患者家属模…

git 使用 (备查)

git忽略清单 添加忽略清单 SSH免登录 ssh协议可以实现免登录操作&#xff0c;身份验证通过密钥实现。 跨团队写作 解决冲突 拉取 克隆 拉取最新版本 推送 远程仓库别名 直接使用git push推送 多人协作开发 分支命令 合并分支命令在主分支使用&#xff0c;将develop分支合并到…

【多模态】27、Vary | 通过扩充图像词汇来提升多模态模型在细粒度感知任务(OCR等)上的效果

文章目录 一、背景二、方法2.1 生成 new vision vocabulary2.1.1 new vocabulary network2.1.2 Data engine in the generating phrase2.1.3 输入的格式 2.2 扩大 vision vocabulary2.2.1 Vary-base 的结构2.2.2 Data engine2.2.3 对话格式 三、效果3.1 数据集3.2 图像细粒度感…

Git详细讲解

文章目录 一、Git相关概念二、本地分支中文件的添加 、提交2.1 文件状态2.2 创建Git仓库2.2.1 git init2.2.2 git clone 2.3 添加操作(git add)2.4 提交操作&#xff08;git commit&#xff09;2.5 撤销操作2.5.1 撤销 add操作2.5.2 撤销 commit操作2.5.3 覆盖上一次的commit操…

单片机的省电模式及策略

目录 一、单片机省电的核心策略 二、单片机IO口的几种模式 三、单片机的掉电运行模式 &#xff08;1&#xff09; 浅谈cpu运行为什么会需要时钟&#xff1f; &#xff08;2&#xff09;STC15系列单片机内部可以配置时钟 &#xff08;3&#xff09;分频策略&#xff0c;降低…

伪造身份请求怎么办?看这篇就够了

您好&#xff0c; 如果喜欢我的文章或者想上岸大厂&#xff0c;可以关注公众号「量子前端」&#xff0c;将不定期关注推送前端好文、分享就业资料秘籍&#xff0c;也希望有机会一对一帮助你实现梦想 JWT身份鉴权方案&#xff0c;token会作为主要的鉴权方式来作为前后端通信校验…

Linux下的crontab定时执行任务命令详解

在LINUX中&#xff0c;周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件&#xff0c;这些配置文件中包含了命令行及其调用时间。 cron的配置文件称为“crontab”&#xff0c;是“cron table”的简写。 一、cron服务   cron是一个…

[职场] 进入大数据领域需要掌握哪些软件 #其他#职场发展#职场发展

进入大数据领域需要掌握哪些软件 学习大数据首先我们要学习Java语言和Linux操作系统&#xff0c;这两个是学习大数据的基础&#xff0c;学习的顺序不分前后。 Java 大家都知道Java的方向有JavaSE、JavaEE、JavaME&#xff0c;学习大数据要学习那个方向呢? 只需要学习Java的…

Oracle 面试题 | 19.精选Oracle高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

前后端通讯:前端调用后端接口的五种方式,优劣势和场景

Hi&#xff0c;我是贝格前端工场&#xff0c;专注前端开发8年了&#xff0c;前端始终绕不开的一个话题就是如何和后端交换数据&#xff08;通讯&#xff09;&#xff0c;本文先从最基础的通讯方式讲起。 一、什么是前后端通讯 前后端通讯&#xff08;Frontend-Backend Commun…

对象存储minio

参考Linux搭建免费开源对象存储 创建一个data目录 --address和--console-address是MinIO服务器启动命令中的两个参数&#xff0c;它们具有以下区别&#xff1a; --address参数&#xff1a;用于指定MinIO服务器监听的S3 API访问地址。S3 API是用于与MinIO进行对象存储操作的…

数据库管理-第148期 最强Oracle监控EMCC深入使用-05(20240208)

数据库管理148期 2024-02-08 数据库管理-第148期 最强Oracle监控EMCC深入使用-05&#xff08;20240208&#xff09;1 性能主页2 ADDM Spotlight3 实时ADDM4 数据库的其他5 主机总结 数据库管理-第148期 最强Oracle监控EMCC深入使用-05&#xff08;20240208&#xff09; 作者&am…

Red Hat安装Red Hat OpenShift Local

文章目录 环境安装需求硬件操作系统软件包 安装 使用Red Hat OpenShift Local预设置设置Red Hat OpenShift Local启动实例访问OpenShift集群访问OpenShift web console使用OpenShift CLI访问OpenShift集群访问内部 OpenShift registry 使用odo部署示例应用安装odo 停止实例删除…

PointBeV:A Sparse Approach to BeV Predictions

参考代码&#xff1a;PointBeV 动机与出发点 常见显式构建BEV特征的算法会稠密设置BEV网格&#xff0c;这样就会引入背景像素上的无效计算&#xff0c;对应内存与计算资源使用也会变大。这篇文章通过前景点筛选、由粗到精细化、窗口时序融合方式构建一种稀疏化表达的BEV特征表…

陪诊系统|陪诊小程序|陪诊服务让就医更容易

陪诊系统已经出现了好几年。尤其是这两年&#xff0c;它得到了人们的广泛认可。陪诊行业的快速发展主要是因为人们对这个行业的需求非常大。目前&#xff0c;我国面临着严重的老龄化问题&#xff0c;生活节奏也越来越快&#xff0c;有时候无法亲自陪伴在老人的身边。陪诊工作人…

Web课程学习笔记--CSS-Sprite的应用

雪碧图CSS Sprite的应用 CSS雪碧&#xff0c;即CSS Sprite&#xff0c;也有人叫它CSS精灵&#xff0c;是一种CSS图像合并技术&#xff0c;该方法是将小图标和背景图像合并到一张图片上&#xff0c;然后利用css的背景定位来显示需要显示的图片部分。例如常见的商品分类导航其实所…