初学TypeScript系列(四)

84 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

TypeScript 中的类

readonly 修饰符

readonly 关键字将属性设置为只读的,不可以改变。只读属性必须在声明时或构造函数里被初始化

class Person {
  // 声明
  readonly name: string
  constructor(name) {
    // 赋值  
    this.name = name
  }
}

let joke = new Person('Joke')
// joke.name = 'peter' // error   无法分配到 "name" ,因为它是只读属性。

//在构造函数里使用 `readonly name: string` 参数来创建和初始化 `name` 成员(实现声明和赋值)
class Person2 {
  constructor(readonly name: string) {
  }
}
const p = new Person2('Tom')
console.log(p.name) // Tom

存取器

通过 getters/setters改变属性的赋值和读取行为

class Person {
  firstName: string = 'A'
  lastName: string = 'B'
  get fullName () {
    return this.firstName + '-' + this.lastName
  }
  set fullName (value) {
    const names = value.split('-')
    this.firstName = names[0]
    this.lastName = names[1]
  }
}

const p = new Person()
console.log(p.fullName) // 'A-B'

p.firstName = 'C'
p.lastName =  'D'
console.log(p.fullName) // 'C-D'

p.fullName = 'E-F'
console.log(p.firstName, p.lastName) // 'E' 'F'

静态属性 、 静态方法

使用 static 修饰符修饰的属性或者方法。存在于类本身上,可以直接通过类来调用

class Person {
  /* 
  静态属性, 是类对象的属性(如:name2)
  非静态属性, 是类的实例对象的属性  (如:name1)
  */ 
  name1: string = 'Joy'
  static name2: string = 'Una'

  static isPerson(a) {
    return a;
  }
}

console.log(new Person().name1) // 'Joy'
console.log(Person.name2) //'Una'
let people = Person.isPerson('Jack'); 
console.log(people) // 'Jack'

抽象类

abstract 关键字用于定义抽象类和其中的抽象方法

抽象类不能创建实例对象

抽象类中的抽象方法必须被子类实现

abstract class Animal {
  abstract cry ()
  run () {
    console.log('100米')
  }
}

class Dog extends Animal {
  cry () {
    console.log('wang wang')
  }
}
const cat = new Animal() //无法创建抽象类的实例。
const dog = new Dog() 
dog.cry() //'wang wang'
dog.run() //'100米'

类与接口

初学TypeScript系列(一)这篇文章中简单学习了接口可以用来描述对象的类型。

这里主要学习类实现接口,对类一部分行为的抽象(描述)。

像不同的类之间有一些共有的特性,可以把特性提取成接口(interfaces),用 implements 关键字来实现。

比如动物为一个类,小鸟是动物的子类。小鸟可以实现飞行,所以可以给小鸟添加一个飞行方法。这时候如果有另一个类飞机,飞机也有飞行功能,就可以把飞行功能做为小鸟和飞机共有的特性提取出来作为一个接口,小鸟和飞机都能实现该接口

interface Fly {
  fly(): any;
}
class Animal {
}
class Bird extends Animal implements Fly {
  fly() {
      console.log('bird fly');
  }
}
class Aircraft implements Fly {
  fly() {
      console.log('Aircraft Fly');
  }
}
let sparrow = new Bird()
sparrow.fly()
  1. 一个类可以实现多个接口
interface Alarm {
  alert(): any;
}

interface Light {
  lightOn(): void;
  lightOff(): void;
}

class Car implements Alarm, Light {
  alert() {
    console.log('Car alert');
  }
  lightOn() {
    console.log('Car light on');
  }
  lightOff() {
    console.log('Car light off');
  }
}
  1. 接口继承接口

和类一样,接口也可以相互继承。相当于从一个接口里复制成员到另一个接口里,可以更灵活地将接口分割到可重用的模块里。

interface Alarm {
    alert(): void;
}

//LightableAlarm 继承了 Alarm,所以就拥有了三个方法:alert 、 lightOn、 lightOff。
interface LightableAlarm extends Alarm {
    lightOn(): void;
    lightOff(): void;
}