Typescript中的类,接口,泛型

131 阅读4分钟

Typescript中的类

1.es5中的类:

function Person(){
  this.name = '张三';
  this.age = 20;
  this.info=function(){
    console.log( `我叫${this.name},今年${this.name}`);
  }
}
var p = new Person();
p.name //张三
p.info()

2.ts中的类:

class Person {
  name: string='李四';
  age: number = 20;
  constructor(message: string) {
    this.name = message;
  }
  info():void {
    console.log( `我叫${this.name},今年${this.name}`);
  }
}
let g2 = new Person('张三');
console.log(g2.name);
console.log(g2.info());

3.ts中类的继承

//(3) ts类的继承,
class Shape { 
  Area:number 
  
  constructor(a:number) { 
    this.Area = a 
  } 
} 

class Circle extends Shape { 
  disp():void { 
    console.log("圆的面积:  "+this.Area) 
  } 
}
//实例中创建了 Shape 类,Circle 类继承了 Shape 类,Circle 类可以直接使用 Area 属性
var obj = new Circle(223); 
obj.disp()

4.ts中类的重载

//(4) ts类的重载
class PrinterClass { 
  doPrint():void {
    console.log("父类的 doPrint() 方法。") 
  } 
} 

class StringPrinter extends PrinterClass { 
  doPrint():void { 
    super.doPrint() // 调用父类的函数
    console.log("子类的 doPrint()方法。")
  } 
}
//类继承后,子类可以对父类的方法重新定义,这个过程称之为方法的重写。
// 其中 super 关键字是对父类的直接引用,该关键字可以引用父类的属性和方法。

5.ts中类的多态

//(5) ts中的多态
// 父类定义一个方法不去实现,让继承他的派生类去实现,每一个派生类有不同的表现
class Father {
  public age: number;
  constructor(age: number) {
    this.age = age
  }
  counts(): void {
    console.log(this.age)
  }
}

class children1 extends Father {
  constructor(age: number) {
    super(age)
  }
  counts(): void {    /* 多态,重写方法不执行父类方法 */
    console.log(this.age - 1)
  }
}

class children2 extends Father {
  constructor(age: number) {
    super(age)
  }
  counts(): void {
    console.log(this.age + 1)
  }
}

6.static 关键字

//static 关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。
class StaticMem {  
  static num:number; 
  
  static disp():void { 
    console.log("num 值为 "+ StaticMem.num) 
  } 
} 

StaticMem.num = 12     // 初始化静态变量
StaticMem.disp()       // 调用静态方法

7.访问控制修饰符

//(7) 访问控制修饰符
// public(默认) : 公有,可以在任何地方被访问。

// protected : 受保护,可以被其自身以及其子类和父类访问。

// private : 私有,只能被其定义所在的类访问。

// readonly :只读属性

class Person {
  public name: string;
  // private name: string; 
  // protected name: string; 
  // readonly  name: string; 
  constructor(name: string) {
    this.name = name;
  }
}

class Man extends Person {
  private love: string;
  constructor(name: string, love: string) {
    super(name);
    this.love = love;
  }
  public say():void {
    // 如果Person 中用 private 修饰 name 则不能访问到 name 属性
    console.log(`my name is ${this.name}, and my love is ${this.love}`);
  }
}
let me = new Man('funlee', 'TS');
me.name = 'new name'; // error

8.ts 中的抽象类

// (8) ts中的抽象类
// 抽象类只能作为其他派生类的基类使用,抽象类不能被实例化
// 抽象类可以包含成员的实现细节,且抽象类必须用 abstract 声明
// 抽象类里不含方法体的方法称为抽象方法,使用 abstract 声明,抽象方法必须被派生类实现(抽象方法必须使用 abstract 关键字声明,且可以包含访问修饰符)

abstract class Person { //抽象类
  public love: string;
  constructor(love: string) {
    this.love = love;
  }
  abstract sayLove(): string; // 必须在派生类中实现
}

class Woman extends Person{
  constructor(love: string){
    super(love)
  }
  sayLove():string {
    return `my love is ${this.love}`;
  }
}
let you = new Woman('TS');
console.log(you.sayLove()); // my love is TS

9.类作为接口使用

//(9) 把类当做接口使用
//类定义会创建两个东西:类的实例类型和一个构造函数,因为类可以创建出类型,所以能够在允许使用接口的地方使用类。
class Person {
  name: string;
  age: number;
  constructor(name: string, age:number) {
    this.name = name;
    this.age = age;
  }
}

interface Jerry extends Person {
  love: string;
}

let he: Jerry = {
  name: 'jerry',
  age: 18,
  love: 'TS'
}

Typescript中的接口

问题:什么是接口?

我觉得接口就是在面向对象编程中的一种规范的定义,定义行为和动作,起到一种限制和规范代码的作用

1.属性接口

//对json的约束
interface Person{
   name:string;
   age?:number
}

2.对函数的约束

  interface Memo{  //对函数的约束
    (value:number,name:string):void
  }

3.对数组的约束

  interface Arr{ //定义数组
    [index:number]:string  //index:索引值,
  }
  let arr:Arr=['ddd'] //value为string

4.对象的约束

  interface Obj{ //定义对象
    [index:string]:string  //index:索引值,
  }
  let ob:Obj={name:'123'} //value为string

5.接口的实现

  interface Anmails{
    name:string;
    eat(name:string):void
  }

  class Dog implements Anmails{  //implements关键字 为‘实现’ 相当于class Dog 实现Anmails 接口
    name:string;
    constructor(name:string){
      this.name=name
    }
    eat(name:string){
      console.log(this.name)
    }
  }

6.接口的继承

//接口的继承 
  interface Anmails{
    eat(food:string):string
  }

  interface Cat extends Anmails{
    runing():void
  }

  class buleCat implements Cat{
    name:string
    constructor(name:string){
      this.name=name
    }
    eat(food:string){
      return  this.name+'吃'+food
    }
    runing(){
      console.log( this.name+'在跑');
    }
  }

  var xiaoke = new buleCat('小可');
  xiaoke.eat('猫粮')
  xiaoke.runing()

Typescript中的泛型

\

泛型是什么呢?

泛型的可以理解 为一个类似于基类概念的类型检查,

举个例子

// T表示泛型 

function getData(value: any): any {
  return value;
}
getData(123)
//getData('123')
//getData(true)

/**********************************************************************************/

function getData<T>(value: T): T {  // T表示泛型  可以保证函数的参数类型和返回值类型一致
  return value;
}
getData<number>(123)
//getData<string>('123')
//getData<boolean>(123)

//这里的第一种写法和第二种写法是一样的效果 但是第一种写法使用any就等于放弃了类型检查

泛型类

class Demo {
  
  getValue(val:number):number {
    return val
  }
}
let demo = new Demo();
console.log(demo.getValue(1));  //1


//这里的 Demo 只能传入number 类型的参数 不能传入string
//这种情况下 可以用泛型类
/**********************************************************************************/

class Demo<T> {
 
  getValue(val:T):T {
    return this.a+val
  }
}
let demo = new Demo<number>();
console.log(demo.getValue(1));  //1

let demo2 = new Demo<string>();
console.log(demo.getValue('2'));  //2

泛型接口

//第一种写法  

interface Demo{
    T(val?:T)T
}

let getData:Demo=function<T>(value:T):T{
  return value
}

getData<string>('12356')
getData<number>(12356)
getData<number>('123456')  //错误写法


/**********************************************************************************/

//第二种写法
interface Demo<T>{
    (val?:T)T
}

function getData<T>(value:T):T{
  return value
}

let myGetData:Demo<string>=getData;

myGetData('20')
myGetData(20)  //错误写法