【TypeScript】TS入门到实战(详解:高级类型)

目录

第三章、TypeScript的数据类型

3.1 TypeScript的高级类型

3.1.1 class

3.1.1.1 熟悉class类

3.1.1.2 class类继承的两种方式

3.1.1.3 class类的5种修饰符

3.1.2 类型兼容

3.1.3 交叉类型

3.1.4 泛型

3.1.4.1 创建泛型函数

3.1.4.2 泛型函数的调用

3.1.4.3 泛型约束

3.1.4.4 泛型接口

3.1.4.5 泛型类

3.1.4.6 泛型工具类型

3.1.5 索引签名类型

3.1.6  映射类型


第三章、TypeScript的数据类型

3.1 TypeScript的高级类型

3.1.1 class

3.1.1.1 熟悉class类
  • 引言
class Person {}
const p = new Person()

当创建一个Person类时,添加了实例对象p,由类型推论可以知道它的类型是Person;说明TS 中的 class,不仅提供了 class 的语法功能,也作为一种类型存在。接下来跟着小编一起理解class吧。

  • 初始化属性
class Person {
    age: number // 适用没有默认值
    name = 'VE' // 适用于有默认值
}
  1. 声明成员 age,类型为 number(没有初始值)。
  2. 声明成员 name,并设置初始值,此时,可省略类型注解(TS 类型推论 为 string 类型)。
  3. 当没有默认赋值时,需要自定义属性的类型,否则会默认为any类型赋值后,属性的类型会与赋值的类型一致,赋值的类型ts会类型推论
  4. 看下图的几种情况:

 

  • 构造函数
class Person {
    age: number
    name: string

    constructor (name: string, age: number){ // 初始化实例对象使用的,写了contructor函数后初始化实例对象时也需要传参从而初始化实例中的属性
        this.age = age
        this.name = name
    }
}
const p = new Person('10', 10)
  1. 只有初始化(比如,age: number)后,才可以通过 this.age 来访问实例成员。
  2. 需要为构造函数指定类型注解,否则会被隐式推断为 any;构造函数不需要返回值类型。
  3. constructor构造函数是初始化实例对象使用的,写了contructor函数后初始化实例对象时也需要通过传参从而初始化实例中的属性参数顺序跟constructor一致

 

  • 实例方法
class Point {
    x: number
    y: number

    scale (n: number): void{
        this.x *= n
        this.y *= n
    }
}
  1. 方法初始化,它的的类型注解(参数和返回值)与函数用法相同

3.1.1.2 class类继承的两种方式

类继承的两种方式:1、extends(继承父类) 2、implements(实现接口)
注意:JS 中只有 extends,而 implements 是 TS 提供的。

  • extends(继承父类)
class Animal { // 这是父类Animal 
    distance: string = '10' // 父类中的属性
    move () { // 父类中的方法
        console.log('move along')
    }
}

class Dog extends Animal { // 子类 Dog 继承父类 Anima
    bark () { // 子类自身的方法
        console.log('汪汪汪~')
    }
}

const dog = new Dog() // dog是Dog的实例对象,

// 从而dog同时具有了父类 Animal 和 子类 Dog 的所有属性和方法
dog.move()
dog.bark()
dog.distance = '20'
console.log('距离', dog.distance)

  1. 通过 extends 关键字实现继承。
  2. 子类 Dog 继承父类 Animal,则 Dog 的实例对象 dog 就同时具有了父类 Animal 和 子类 Dog 的所有属性和方法。
  • implements(实现接口): 这是ts新增的,顾名思义就是对一个接口的实现

interface Singable { // 这是添加的一个接口,定义了Singable有哪些属性和方法的类型
    name: string 
    sing: () => void
    toSing(): void
}

class Person implements Singable { // Person类是对Singable接口的实现
    name = 'VE'
    sing = () => { // 函数方面是箭头函数还是普通函数需要我们自己规范
        console.log('你是我的小啊小苹果')
    }
    toSing(): void {
        console.log('去ktv唱歌')
    }
}

const p = new Person() // p是Person的一个实例对象

// 从而拥有了Singable 接口 指定的所有方法和属性
console.log(p.name)
p.sing()
p.toSing()

  1. 通过 implements 关键字让 class 实现接口。
  2. Person 类实现接口 Singable 意味着,Person 类中必须提供 Singable 接口中指定的所有方法和属性。
3.1.1.3 class类的5种修饰符

可见性修饰符包括:1、public(公有的) 2、protected(受保护的) 3、private(私有的)4、readonly(只读修饰符)5、static(静态的)

  • public(公有的)

class Animal {
    public move () { // 在父类的方法中添加pubilc(默认,可省略)
        console.log('move along')
    }
}
class Dog extends Animal { // 子类
    bark () {
        console.log('汪汪汪~')
    }
}

class Cat extends Animal { // 子类
    bark () {
        console.log('喵~喵~喵~')
    }
}

const dog = new Dog() // 由于父类设置的为pubilc修饰符,所有其子类实例可以调用父类的方法

dog.move()
dog.bark()

const cat = new Cat() // 由于父类设置的为pubilc修饰符,所有其子类实例可以调用父类的方法

cat.move()
cat.bark()

  1. 在类属性或方法前面添加 public 关键字,来修饰该属性或方法是共有的
  2.  因为 public 是默认可见性,所以,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值