ts学习笔记

51 阅读4分钟

image.png

image.png

ts基础语法

  1. 官网:www.typescriptlang.org/
  2. 定义:ts是js的超集,js的类型是动态类型,ts的类型是静态类型
  3. 优势:
  •     开发过程中,发现潜在问题
    
  •     更好的编辑器自动提示
    
  •     代码语义更清晰易懂
    
  1. ts基础环境搭建

      node 
      单引号 2个空格缩进 prettier插件  formate on save   
      npm i typescript@3.6.4 -g
      tsc demo.ts  编译demo.ts文件
      node demo.js  运行编译后的文件
      tsc --init 初始化ts项目 会生成tsconfig.json文件
      npm i ts-node@8.4.1 -g  
      ts-node demo.ts 编译文件并执行
    
  2. 基础类型和对象类型

       基础类型:number\string\null\undefined\symbol\boolean\void
       对象类型:object、array、tuple、classfunction
    
  3. 类型注解和类型推断

       类型注解:显式告诉ts变量是什么类型
       类型推断:ts自动分析变量的类型
       *tips: 如果ts能够自动分析变量的类型,我们就什么也不需要做了;如果ts无法分析变量类型的话,我们就需要使用类型注解*
    
  4. 函数相关类型

      ` const func = function(str: string):number{
           return parseInt(str,10)
       }
       const func: (str: string)=> number = function(str){
           return parseInt(str,10)
       }`
    
  5. 联合类型

           let name: string | number = '123'
           name = 123
    
  6. 类型别名

           type User = {name: string, age: number}
           type PersonName = string
    
  7. 数组和元组

           数组: const arr: number[] = [1,2,3]
                  const arr: Array<number> = [1,2,3]
                  const arr: (number | string)[] = [1,'2',3]
                  const arr: User[] = [{name:'wyb',age: 24}]
           元组: 
               元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同
               const tuple: [number,string] = [24,'wyb']
    
  8. 接口

     通用性类型集合,定义对象和函数
     
     类型别名和接口区别:
         接口只能定义函数或对象,类型别名可以定义任何类型;接口和类型别名,优先采用接口的形式定义类型
     可选属性、只读属性
           `interface Person{
               readonly name: string;
               age?: number;
               [propName: string]: any;// 可以接受额外的属性
               say():string;
           }`
     如果传值是字面量,ts会强校验接口,定义的属性和方法不能多也不能少
     类应用接口
               `class User implements Person{
                   name = 'wyb'
                   say(){
                       return 'hello'
                   }
               }`
       接口继承接口
               `interface Teacher extends Person {
                   teach(): string;
               }`
       可以继承多个接口
               `interface Shape { color: string; } interface PenStroke { penWidth: number; } interface Square extends Shape, PenStroke { sideLength: number; }`
       接口定义函数
           需要给接口定义一个调用签名。 它就像是一个只有参数列表和返回值类型的函数定义。参数列表里的每个参数都需要名字和类型
              interface SayHi{
                  (word: string) : string;
              }
        接口定义可索引的类型
            可索引类型具有一个 *索引签名*,它描述了对象索引的类型,还有相应的索引返回值类型。
             interface StringArray { 
                 [index: number]: string; 
             }
    
  9. 定义:

         class Person {
             name = 'wyb'
             getName(){
                 return this.name
             }
         }
    

    继承:

        class Teacher extends Person {
             getTeacherName(){
                 return 'Teacher'
             }
             // 属性重写,子类可以覆盖覆盖
             // super相当于父类,可以调用父类的方法
             getName(){
                 return (super.getName() + 'yh')
             }
         }
    

类中的访问类型和构造器:

访问类型

private、protected、public访问类型
      public 允许在类内外被调用
      private 允许在类内部使用
      protected  允许在类内部及继承的子类中使用
      class Person {
         public name: string;
         private age: number;
         protected gender: string;
         public sayHi(){
             // name属性可以在类内被调用
              console.log('hi'this.name)
              // age可以在类内部被调用
              console.log(this.age)
              // gender可以在类内部被调用
              console.log(this.gender)
          }
      }
      class Teacher extends Person {
          public sayBye(){
              // gender 可以在子类中被调用
              this.gender
          }
      }
      const person = new Person()
      // name属性可以在类外被调用
      person.name = 'wyb'
      console.log(person.name)
      // age不可以在类外部被调用  下面的两行代码会报错
      person.age = 24
      console.log(person.age)
     
      const person = new Person('wyb')

构造器:

 class Person {
              public name: string;
              // 初始化类的时候
              constructor(name: string){
                  this.name = name
              }
          }
          // 等同于下面的代码 简化语法
          class Person {
              constructor(public name: string){}
          }
          const person = new Person('wyb')
          class Person {
              constructor(public name:string){}
          }
          // 如果子类有构造器,必须手动调用父类构造函数
          class Teacher extends Person{
              constructor(public age:number){
                  super('wyb')
              }
          }
          const teacher = new Teacher(28)

静态属性,setter和getter

使用get和set能够保护私有变量

class Person{
          constructor(private _name:string){}
          get name(){
              // 可以拦截访问
              return this._name
          }
          set name(name: string){
              // 可以防止随意更改私有变量
              return this._name
          }
      }
      const person = New Person('wyb')
      // 会调用get
      console.log(person.name)
      // 会调用set
      person.name = 'wtt'

单例模式: 只能有一个实例

静态属性是直接放在类上面,而不是实例上面

class Demo{
      private static instance: Demo;
      private constructor(public name: string){}
      static getInstance(){
          if(!this.instance){
              this.instance = new Demo('wyb')
          }
          return this.instance
      }
  }
  const demo1 = Demo.getInstance()
  const demo2 = Demo.getInstance()
  demo1和demo2都是同一个实例

readonly修饰器 可以定义public只能读不能写

方式一
      class Person{
          private _name: string;
          constructor(name:string){
              this._name = name
          }
          get name(){
              return this._name
          }
      }
      方式二
      class Person{
          constructor(public readonly name:string){}
      }
      方式三
      class Person{
      public readonly name:string;
          constructor(name:string){
              this.name = name
          }
      }    

抽象类: 就是将类通用性的方法和属性提出来 抽象类可以是具体实现,也可以是抽象的表示

abstract class Gemo{
          // 具体实现
          getType(){
              return 'Gemo'
          }
          // 抽象表示
          abstract getArea(): number
      }
      class Circle extends Gemo{
          // 子类里面必须有抽象的具体实现
          getArea(){
              return 123
          }
      }

爬虫功能开发

ts语法进阶

项目接口开发

ts高级语法

项目代码重构

目前端开发

课程总结