Typescript学习笔记

ts数据类型

1,boolean

var flag:boolean=true

2,number

var num:number=123

3,数组类型

var arr1:number[]=[1,2,3]
var arr2:Array<number>=[1,2,3]
var arr3:any[]=[1,"2",true]

4,string

var string:string="1212"

5,元祖类型(tuple)

let arr:[number,string]=[1,"2"]

6,枚举类型

enum Flag1{success=1,error=2}
let s:Flag1=Flag1.success;
console.log(s)   //1

enum Flaf2{blue,red};
let s:Flag2=Flag2.red;
console.log(s)   //1 如果为赋值,则为下标

7,任意类型 es5中未指定的类型(object)

var num:any=123/'123'/true

8, null和undefined

var num:undefined;
console.log(num)   //不报错

var num:number;
console.log(num)  //报错

9,void没有任何类型

function(){
    console.log('此函数没有任何返回值')
}

10,never类型(不常用)

11,函数定义

函数声明
function getInfo(name:string,age:number):string{
    return name+'--'+age
}

匿名函数
var getInfo=function(name:string,age:number):string{
     return name+'--'+age
}

//可选参数
function getInfo(name:string,age?:number){

}

//默认参数
function getInfo(name:string,age:number=20){

}

//剩余参数
function getInfo(...result:number[]){

}
console.log(getInfo([1,2,3,4]))

//函数重载  详见百度

//匿名函数(同es6)

12,TS中类的定义

//es5
    function Persion(name){
        this.name=name;
        this.run=function(){
            alert(this.name)
        }

    }

//ts中

class Persion{
    name:string;   //省略public
    constructor(name:string){  //构造函数,实例化的时候会处罚的方法
        this.name=name
    }

    run():void{
        alert(this.name)
    }
}

13,ts中类的继承

class Person{
    name:string,
    constructor(name:string){
        this.name=name
    }
    run():void{
        alert(this.name)
    }

class Web extends Person{
    constructor(name){
        super(name)   //初始化父类的构造函数
        }
    }
}

//父类和子类有同样的方法则会调用子类的方法

14,修饰符

  • public:公有,在类和子类,类外都能访问
  • protected:保护,在类,子类中都能访问
  • provate:私有,在类中可以访问,子类和类外都不能访问

15,TS中的静态属性和静态方法

  • 先来了解一下ES5中的静态属性和静态方法
function Persion(age){
    this.age=age;   //实例属性
    this.run=function(){
        //实例方法
    }
}
Persion.name='xxx';  //静态属性
Persion.play=function(){
    //静态方法
}
//在jq中会用到
function $(element){
    return new Base(element)

}
function Base(element){
    this.el=document.getElementBy(element);
    this.css=function(attr,value){
        this.el.style.attr=value
    }
}
//对应jq方法:$("button").css("color",'red')

  • ts中的静态属性和静态方法
class Person{
    name:string;
    static age:number=12;
    constructor(name:string,age:number){
        this.name=name;
        this.age=age;
    },
    run():void{
        alert(this.name)
    }
    static play():number{   //静态方法
        return Persion.age
    }
}
console.log(Person.age)  //12
console.log(Persion.play())

16,多态:父类定义一个方法不去实现,让继承他的子类去实现,不同的子类有不同的实现方法(多态属于继承)

class Animal{
    name:string,
    constructor(name:string){
        this.name=name;
    },
    eat(){
        console.log("吃的方法")
    }
}

class Dog extends Animal{
    constructor(name:string){
        super(name);
    }
    eat(){
        return this.name+'吃粮食'
    }
}

class Cat extends Animal{
    constructor(name:string){
        super(name)
    }
    eat(){
        return this.name+'吃鱼'
    }
}

17,抽象方法和抽象类

  • 抽象类:提供其他类继承的基类,不能够被实例化
  • 用abstract关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
  • abstract抽象方法必须放在抽象类里
// 抽象类和抽象方法用来定义标准,标准animal这个类要求她的子类必须包含eat方法

abstract class Animal{
    name:string:name;
    constructor(name:string){
        this.name=name;
    }
    abstract eat():any;// 抽象方法只能出现在抽象类中
}

new Animal  //错误写法,不能够被实例化

class Dog extend Animal{
    constructor()
}

18,接口

定义

接口是一种规范的定义,他定义了行为和动作的规范,在程序设计里面接口起到一种限制和规范的作用,接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,她只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要,typescript中的接口类似于java,同时还增加了更灵活的接口类型,包括属性函数可索引和类等


  • 属性接口(对json的约束)

// TS中定义方法传入参数

function printLabel(labelInfo:{label:string}){
   console.log('print label')
}

//对批量方法传入的参数进行约束

interface FullName{   //传入的参数有且必须是firstName和secondName
   firstName:string;
   secondName:string;
   thirdName?:string;   //接口可选属性,可传可不传

}
function printName(name:FullName){
   //必须传入对象 firstName secondName
   console.log(name.firstName)
}
  • 举个例子ajax
inerface Config{
    type:string;
    url:string;
    data?:string;
    dataType:string;
}
function ajax(config:Config){
    var xhr=new XMLHttpRequest();
    xhr.open(config.type,config.url,true);
    xhr.send(config.data);
    xhr.onreadystatechange=function(){
        if(xhr.readyState==4&&xhr.status==200){
            console.log('成功')
        }
    }
}

  • 函数类型接口:对方法传入的参数以及返回值进行约束 批量约束
//加密的函数类型接口
    interface encrypt{
        (key:string, :string):string;
    }

    var md5:encrypt=function(key:string,value:string){  //传入的参数格式复合上面接口的约束
        //模拟操作
        return key+value
    }

    console.log(md5('name',"张三")),


    var sha1:encrypt=function(key:string,value:string){
        return key+'---'+value
    }

    console.log(sha1('李四',"212"))

  • 可索引接口,数组、对象的约束(不常用)
//ts中定义数组的方式
var arr:number[]=[1221,21212];

---

//可索引接口写法一 对数组的约束
interface UserArr{
    [index:number]:string
}

var arr:UserArr=["12121",'212121'];
console.log(arr[0])   //'12121'

//可索引接口写法二   对对象的约束
interface UserObj{
    [index:string]:string
}

var arr:UserObj={name:"zhangsan',age:"213"};


  • 类类型接口:对类的约束 和抽象类有点类似
interface Animal{
//整合属性类型接口和方法类型借口
    name:'string',
    eat(str:string):void;   
}

class Dog implements Animal{
    name:string;
    constructor(name:string){
        this.name=name;
    }
    eat():void{
        console.log(this.name+"吃粮食")
    }
}

var d=new Dog("小黑");
d.eat();  //小黑吃粮食

19,接口的扩展、接口的继承

interface Animal{
    eat():void;
}

//人继承Animal的接口
interface Persion extends Animal{
    work():void;
}


class Programmer{
    public name:string;
    constructor(name:string){
        this.name=name;
    }
    coding(code:string){
        console.log(this.name+code)
    }
}

//继承结合接口
 class Web  extends Programmer implements Persion{   //父类所有规范都要实现
    //  public name:string;
     constructor(name:string){
         super(name)
     }
        eat(){
            console.log(this.name+"--"+"喜欢吃馒头")
        }  
        work(){
        console.log(this.name+"写代码")
    }  
 }


20,泛型

  • 泛型的定义
  • 泛型函数
  • 泛型类
  • 泛型接口
/*
泛型,软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。组建不仅能够支持当前的数据类型,同事也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。

在像C#和JAVA这样的语言中,可以使用泛型来创建可重用的组建,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件。

通俗理解,泛型就是解决类 接口 方法的复用性 以及对不特定数据类型的支持
*/
//只能返回string类型的数据

function getData(value:string):string{
    return value;
}

function getData1(value:number):number{
        return value;
}

//泛型:可以支持不特定的数据类型  要求:传入的参数和返回的参数一致

//定义一个泛型  T表示泛型,具体什么类型是调用这个方法的时候决定的
function getData<T>(value:T):T{   //也可以指定返回any类型
        return value;
}

getData<number>(123);  //限制传入的参数是number,则返回的参数也必须是number 


//泛型类:比如有个最小堆的算法,需要同时支持返回数字和字符串两种类型,通过类的泛型来实现

class MinClass{
    publc list:number[]=[];
    add(num:number){
        this.list.push(num)
    }
    min(){
           var minNum=this.list[0];
           for(var i=0;i<this.list.length;i++){
               if(minNum>this.list[i]){
                   minNum=this.list[i];
               }
           } 
           return minNum; 
    }
}
//上面的类是只能返回number

//定义一个类的泛型
class MinClass<T>{
        public list:T[]=[];
        add(value:T):void{
            this.list.push(value);
        }
        min():T{
           var minNum=this.list[0];
           for(var i=0;i<this.list.length;i++){
               if(minNum>this.list[i]){
                   minNum=this.list[i];
               }
        } 
        return minNum; 
    }
}

//实例化类,并且制定了类的T代表的类型是number
var m1=new MinClass<number>();
m1.add(1);
m1.add(3);
m1.add(2);

alert(m1.min());


//泛型接口

interface ConfigFn{
    <T>(value:T):T;
}

var getData:ConfigFn=function<T>(value:T):T{
    return value;
}

getData<string>("张三")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值