TypeScript|青训营笔记

57 阅读4分钟

深入浅出TypeScript

是JavaScript的超集,用于解决大型项目的代码复杂性,类型安全,完善的工具链

特点:

  • 强类型,支持静态和动态类型
  • 可以在编译期间发现并纠正错误
  • 不允许改变变量的数据类型

TS基础

类型:

  • Boolean、number、string
  • 枚举enum
  • any、unknown、void
  • never(永远不存在值)
  • 数组类型[]
  • 元组类型tuple

函数类型

定义输入参数类型和输出类型

输入参数:支持可选参数(可选参数只需在参数名后跟随一个?即可)和默认参数(当为参数指定了默认参数时,TypeScript 会识别默认参数的类型;当调用函数时,如果给这个带默认值的参数传了别的类型的参数则会报错)

输出参数:输出可以自动推断,没有返回值时,默认void类型

函数重载:TypeScript的函数重载通过为一个函数指定多个函数类型定义,从而对函数调用的返回值进行检查

注:TypeScript 中可以为剩余参数指定类型,函数重载只能用 function 来定义,不能使用接口、类型别名来定义

接口

接口是为了定义对象类型

特点:

  • 可选属性:?

  • 只读属性:readonly,只允许出现在属性声明或索引签名或构造函数中 ,如果 readonly 和其他访问修饰符同时存在的话,需要写在其后面

    • class Animal {
        readonly name;
        public constructor(name) {
          this.name = name;
        }
      }
       
      let a = new Animal('Jack');
      console.log(a.name); // Jack
      a.name = 'Tom';
      
  • 可以描述函数类型

  • 可以描述自定义属性

比JavaScript增加了一些定义

特点:

  • 增加了public、private、protected修饰符
    • public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的
    • private 修饰的属性或方法是私有的,不能在声明它的类的外部访问
    • protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的
  • 抽象类:只能被继承,不能被实例化,作为基类,抽象方法必须被子类实现
  • interface约束类,使用implements关键字

TS进阶

高级类型

1.联合类型|

// 联合类型 (只需满足其中一个接口类型所定义的属性)
let lhType : myInter1 | myInter2={
    name:'',
    fun1(): void {}
}

class Dog1{
    constructor(public name: string) {}
    run(){
        console.log(this.name)
    }
}
class Dog2{
    constructor(public age: number) {}
    run(){
        console.log(this.age)
    }
}

// 如果变量类型是多个类的联和,那么
function f(num:number) {
    let lhType = num===1?new Dog1('rose'):new Dog2(3)
    // 此时lhType去调用类中的方法时,只能调用他们的相同属性名的值
    lhType.run()
}

2.交叉类型&,交叉类型是将多个类型合并为一个类型

interface myInter1 {
    name:string;
    fun1():void
}
interface myInter2 {
    fun2():void
}

// 此时定义的jcType是myInter1和myInter2的交叉类型,其中必须包含这两个接口中定义的属性
let jcType :myInter1 & myInter2 = {
    name:'haha',
    fun1() {},
    fun2() {},
}

3.类型断言

4.类型别名(type vs interface)

-定义:给类型起个别名

相同点:

  • 都可以定义对象或者函数

  • 都允许继承

不同点:

  • interface是用来定义对象,type用来定义别名方便使用
  • type可以定义基本类型,interface不行
  • interface可以合并重复声明,type不行

参考链接:www.jianshu.com/p/d872dc8b7…

泛型

解决输入输出可关联的定义

语法是<>里面写类型参数,一般用T表示

使用时有2种方法指定类型:定义要使用的类型/通过TS类型推断,自动推导类型

泛型的作用是临时占位,之后通过传来的类型进行推导

基础操作符:

  • typeof:获取类型

  • keyof:获取所有键

  • in:遍历枚举类型

  • T[k]:索引访问

  • extends:泛型约束

常用工具类型:

  • Partial:将类型 T 中的所有属性变为可选属性。
  • Required:将类型T中的所有可选属性变为必选属性。
  • Pick<T,K>:可以将类型T中选择指定的属性K,生成一个新的属性。
  • Omit<T, K>:从类型 T 中删除指定的属性 K,生成一个新的类型。
  • Record<K, T>: 它可以生成一个类型为 T 的对象,其中属性名的类型为 K。

TS实战

声明文件

在typescript中存在两种文件后缀名,一种是 .ts,另一种是.d.ts结尾的文件,我们主要的代码都是写在以.ts文件结尾的文件中。而.d.ts结尾的文件就是声明文件。声明文件的作用是为js 提供类型检查而存在的。

泛型约束

在 TypeScript 中,可以对泛型进行约束,使得泛型只能接受某些类型或者符合某些条件的类型。这样可以增强泛型的灵活性和安全性。泛型约束有两种形式:类型约束和属性约束。

类型约束是指使用 extends 关键字来约束泛型的类型。

属性约束是指使用类型参数中的属性来约束其他属性。