TS从入门到精通(五)内置对象与类

113 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

内置对象

js里面内置了很多对象,它们可以直接在 TypeScript中当做定义好了的类型。

Dom Bom 以及几种基本数据类型

在浏览器控制台使用 console.dir($0) 看proto类型

console.dir($0)


let body: HTMLElement = document.body;
let allDiv: NodeList = document.querySelectorAll('div');

//读取div 这种需要加类型断言 或者加个判断因为读不到会返回null
let div:HTMLElement = document.querySelector('div') as HTMLDivElement
document.addEventListener('click', function (e: MouseEvent) {
    

定义promise

在js中会使用大量异步操作所以Promise 是最常见的。像是promise 这种ts是很难准确推断出返回值类型的这时候就需要我们手动指定

  • 函数定义返回promise 语法规则 :Promise<T> 类型
    play():Promise<number>{
        return new Promise((resolve,reject){
            resolve(1000)
        })
    }

在开发中,使用promise的机会很多这个时候就要靠自己的能力了

类(Class)

在es6中引入了类的概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。在这方面学过java的朋友有天然优势。

  • 在TypeScript是不允许直接在constructor 定义变量的 需要在constructor上面先声明,同时可指定类型
    class Animal{
        private name:string
        private age:number
        constructor(name:string,age:number){
            this.name=name
            this.age=age
        }
        play 
    }

修饰符

public private protected

public : 可以让你定义的变量 内部访问 也可以外部访问 如果不写默认就是public

private :使用  private 修饰符 代表定义的变量私有的只能在内部访问 不能在外部访问

protected :使用  protected 修饰符 代表定义的变量私有的只能在内部和继承的子类中访问 不能在外部访问。

补充:ES6 类是自带关键字 static 声名静态成员可以通过类名进行访问

  • static 声名的静态成员之间可以通过this互相调用访问

  • 普通成员必须通过类名访问

class Person {
  static num = 1
  private name: string
  private age: number
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
  public static play(): void {
    console.log(this.num); //1
    console.log(Person.num); //1

  }
}
Person.play()

使用接口定义类

  • 接口中不能使用关键字 private public protected 但可以用readonly
  • 使用implements关键字 实现接口
  • 如果实现多个接口interface后用逗号隔开 继承还是用extends
  • 接口与接口之间可以多继承
  • 接口内部不可以写抽象方法
interface AnimalClass {
  play(): void
}
interface TiggerClass {
  run(): void
}

class Person implements AnimalClass,TiggerClass {
  static num = 1
  private name: string
  private age: number
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
  play(): void {
    console.log("我是play");
  }
  run(){
      console.log("我是run")
  }
}

抽象类

如果某个方法的具体实现不确定我们可以把他定义为抽象类,让实现类去重写该方法

abstract class A {
  private name: string
  private age: number
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
  abstract eat(): void
}
class Person extends A implements AnimalClass {
  static num = 1
  constructor(name: string, age: number) {
    super(name, age)
  }
  play(): void {
    console.log("我是实现类");
  }
  eat(): void {
    console.log("eat");

  }
}
let obj: A = new Person("张三", 18);
console.log(obj); //{ name: '张三', age: 18 }
  • 定义的抽象方法必须在派生类实现
  • 类只能继承一个直接父类但可以实现多个接口
  • 可以在内部写方法体