TSday02

/**
 * interface可以描述javascript中对象拥有的各种各样的外形。除了描述带有属性的普通对象,接口也可以描述函数类型
 * 用接口表示函数类型,为接口定义一个调用签名,表示了参数列表和返回值的函数定义
 */
 interface SearchFnuc{
  (souce:string,subString:string):boolean
}
const mySearch:SearchFnuc = function(souce:string,sub:string):boolean{
  return souce.search(sub) > -1
}
console.log(mySearch("abcd","v"))

//接口可以继承
interface Alarm{
  alert():any
}
interface Light{
  lightOn():void
  lightOff():void
}
interface LightAlarm extends Alarm,Light {
  
}

/**
 * ts中定义类
 */
class Greeter {
  //定义属性
  msg:string
  name:string
  //构造方法
  constructor(name:string){
    this.name = name
  }
  //一般方法
  //一般方法:放在原型上的,prototype上的
  greet():string{
    return "hello" + this.name
  }
  //使用static关键字声明,这个方法直接挂在在构造函数上,而不是原型上
  static say():void{
    console.log("hello world" + this.name)
  }
}
let greeter1 = new Greeter("jone")
console.log(greeter1.greet())

class Animal {
  name:string
  constructor(name:string){
    this.name = name
  }
  run(distance: number) {
    console.log(`Animal run ${distance}m`)
  }
}

class Dog extends Animal {
  constructor(name){
    super(name)
  }
  cry() {
    console.log('wang! wang!')
  }
}

const dog = new Dog("wangwang")
dog.cry()
dog.run(100) // 可以调用从父中继承得到的方法



class Animal1 {
  name:string
  constructor(name:string){
    this.name = name
  }

  run(distance:number = 0){
    console.log(`${this.name} run ${distance}m`)
  }
}

class Snake extends Animal1 {
  constructor(name: string){
    super(name)//super调用父类构造方法
  }
  run(distance:number = 5){
    console.log("sliding...")
    super.run(distance)
  }
}

class Horse extends Animal1 {
  constructor(name:string){
    super(name)
  }
  //重写父类方法
  run(distance:number = 50){
    console.log("dashing...")
    super.run(distance)
  }
  say(){
    console.log("sisi")
  }
}
 
const snake = new Snake('sn')
snake.run()

const horse:Horse = new Horse('ho')
horse.run()
horse.say()

// 父类型引用指向子类型的实例 ==> 多态
const tom:Animal1 = new Horse('ho22')
tom.run()

/* 如果子类型没有扩展的方法, 可以让子类型引用指向父类型的实例 */
const tom3: Snake = new Animal1('tom3')
tom3.run()
/* 如果子类型有扩展的方法, 不能让子类型引用指向父类型的实例 */
// const tom2: Horse = new Animal('tom2')
// tom2.run()

/**
 * 公有,私有和受保护修饰符
 * 公有public:默认是公有
 * 私有private:不被外界访问
 * 受保护protected:可以被派生子类继承
 */
class Teacher {
  name:string
  private age:number = 20
  protected sex:boolean = true
  constructor(name:string,public course:string){
    this.name = name
    this.course = course
  }
}
class Student extends Teacher {
  constructor(name:string){
    super(name,"中文")
  }
  myTeacher(){
    console.log(this.sex)
    // console.log(this.age) //error:age是私有属性,只能在Teacher类中访问 
  }
}
const stu1:Student = new Student("zhangsang")

/**
 * 存取器:get和set:存取器通过getter和setter来截取对对象成员的访问
 */

/**
 * 泛型:在定义接口。函数或者类的时候不指定具体的类型,再使用的时候指定具体的类型
 */
function createArray<T>(value:T,count:number):Array<T>{
  let arr:Array<T> = []
  for(var i = 0;i <= count; i++){
    arr.push(value)
  }
  return arr
}
createArray("111",10)
createArray({name:"zhangsan",age:10},10)

//ts中的声明???
declare var jQuery:(selector: string) => any
jQuery("#foo")

  

posted @ 2021-06-22 17:02  jiangchengzi  阅读(21)  评论(0)    收藏  举报