美文网首页
TypeScript语法

TypeScript语法

作者: _前端码农_ | 来源:发表于2019-06-15 12:30 被阅读0次

    一、基础部分

    1.安装和编译
    npm install -g typescript
    tsc helloword.ts
    
    2.用VScode 自动编译 .ts

    a. 创建tsconfig.json文件。 tsc --init 生成配置文件
    b. 任务 - 运行任务,监视tsconfig.json

    3.typescript 中的数据类型(ts新增类型校验,ts 代码必须指定类型)
    • 布尔类型(boolean)
      var flag:boolean=true;

    • 数字类型(number)
      var num:number=123;

    • 字符串类型 (string)

    • 数组类型(array)
      定义数组的两种方式
      a. var arr:number[]=[11,22,33,44] ----- b. var arr:Array<number>=[11,22,33] --- var arr:any[]=[123,'123']

    • 元祖类型(tuple)属于数组的一种,为数组每一个位置指定一个类型
      let arr:[number,string]=[12,'aa']; let arr:Array<number,string>=[12,'string']

    • 枚举类型(enum)

    enum Err {'undefined'=-1,'null'=-2,'success'=1};
    var e:Err=Err.sucess;
    console.log(e) //打印出的为1(如果标识符没赋值,它的值就是下标)
    
    • 任意类型(any)
      var num:any=123;
    • null 和 undefined
      var num:number | null | undefined
    • void 类型
    //当方法没有返回值时:
    function run():void{
      console.log('run')
    }
    
    //当方法有返回值时:
    function run():number {
      return 123;
    }
    
    • never类型
    var a:never;
    a=(()=>{
      throw new Error('错误');
    })()
    
    4. 函数的定义
    //函数声明法
    function run():string{
      return 'run';
    }
    //匿名函数法
    var fun2=function():number{
      return 123;
    }
    //定义方法传参
    function getInfo(name:string,age:number):string{
      return `${name}--${age}`;
    }
    //配置可选参数(用?)
    function getInfo(name:string,age?:number):string{
      return ''
    }
    getInfo('zhangsan');
    //三点运算符,接收传过来的值 
    function sum(...result:number[]):number{
      var sum=0;
      for(var i=0;i<result.length;i++){
        sum+=result[i]
      }
    }
    //ts中方法的重载
    function getInfo(name:string):string;
    function getInfo(name:number):number;
    function getInfo(str:any):any{
      if(typeof str==='string'){
        return ''
      }else{
      return '123'
    }
    
    ts中的类
    class Person(){
      name:string; //属性,前边省略 了public关键词
      constructor(n:string){
         this.name=n;
      }
      run():void{
        alert(this.name)
      } 
    }
    
    class Person(){
      name:string; //属性,前边省略 了public关键词
      constructor(n:string){
         this.name=n;
      }
      getName():string{
        return this.name;
      } 
      setName(name:string):void{
        this.name=name;
      }
    }
    
    ts中的继承
    class Person(){    
      public name:string; //公有属性
      constructor(name:string){
         this.name=name;
      }
     run():string{
        return `${this.name}在运动 `
      } 
    }
    
    class Web extends Person{
      constructor(name:string){
        super(name); //初始化父类的构造函数
      }
    }
    
    var w=new Web('李四');
    alert(w.run();
    
    类里面的修饰符,ts提供了三种修饰符
    • public:公有,内外部都可以访问
    • protected:保护类型 类内部、子类内部可以访问,类外无法访问
    • private:私有 在类内可以访问,子类无法访问。
      属性如果不加修饰符,默认为public
    静态方法和静态属性
    function Person(){
      this.run1=function(){} //实例方法,new之后才能用
    }
    Person.run2(); //静态方法,可以直接用。
    
    class Person(){
      public name:string;
      public age:number=20;
      static sex="男";//静态属性
      constructor(name:string){
        this.name=name;
      }
      run(){ //实例方法
        alert()
      }
      static print(){
        console.log('print'+this.age) //会出错,静态没法不能直接调用类里的属性
        console.log('print'+Person.sex) //不会出错
      } //静态方法
    }
    
    多态:父类定义一个方法,不去实现。让继承它的子类去实现,每个子类有不同的表现。

    比如先定义个ainimal类,里面有eat方法。然后有猫和狗两个子类去继承这个类,然后重写eat的方法。

    抽象类:提供其他类继承的基类,不能直接被实例化。
    用abstract 关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类中实现。

    抽象类和抽象方法用来定义标准,比如:Animal这个类要求它的子类必须包含eat方法。

    abstract class Animal{
      public name:string;
      constructor(name:string){
        this.name=name;
      }
      abstract eat():any;
    }
    var a=new Animal() //错误写法,抽象类不能直接被实例化。只能给其他类提供基类。
    class Dog extends Animal{
      constructor(name:any){
        super(name);
      }
      //抽象类的子类必须实现抽象类中的抽象方法
      eat(){
        console.log('dog)
      }
    }
    

    接口的作用:在面向对象的编程中,它定义了行为和动作的规范,起到限制和规范的作用。它不关心类的内部状态数据和类里方法的实现细节,只规定这批类里必须提供某些方法。ts中的接口类似java,还增加了更多 接口类型,包括属性函数可索引和类等。

    • 属性接口 对json的规范。
    function printLabel(labelInfo:{label:string}):void(){
      console.log(' ')
    }
    printLabel({name:'zhangsan'}) //错误
    printLabel({label:'zhangsan'}) //正确
    
    • 属性类型接口
    interface FullName{ //对传入对象的约束   (属性接口)
      firstName:string;
      secondName:string;
    }
    
    function printName(name:FullName){
    
    }
    

    实例:ajax

    interface 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){
          config.log('success');
      }
      }
    }
    
    ajax({
      tyle:'get',
      url:'http://www.baidu.com,
      data:{},
      dataType:'JSONP' 
     })
    
    • 函数类型接口 (对方法传入的参数以及返回值进行约束 )
    interface encrypt{
      (key:string,value:string):string;
    }
    
    var md5:encrypt=function(key:string,value:string):string{
      return key+value;
    }
    
    • 可索引接口:数组、对象的约束(不常用)
    var arr:number[]=[123,123]
    var arr1:Array<string>=['123','123']
     
    interface UserArr{
      [index:number]:string
    }
    
    var arr:UserArr=['aaa','bbb'];
    console.log(arr[0 ])
    
    • 类类型的接口(对类的约束)
    interface Animal{
      name:string;
      eat(str:string):void;
    }
    
    class Dog implements Animal{
      name:string;
      constructor(name:string){
        this.name=name;
      }
    
      eat(){
        console.log(this.name + '');
      }
    }
    
    var d= new Dog();
    
    • 接口的扩展:接口可以继承接口
    interface Animal{
      eat():void;
    }
    interface Person extends Animal{
      work():void;
    }
    class Programmer{
      public name:string;
      constructor(name:string){
        this.name=name;
        constructor(name:string){
          this.name=name;
        }
        coding(code:string){
          console.log('写代码')
        }
      }
    }
    class Web extends Programmer implements Person{
      public name:string;
      constructor(name:string){
        super(name)
      }
      eat(){
        console.log()
      }
      work(){
        console.log()
      }
    }
    

    --- ts中的泛型:就是解决类、接口、方法的复用性、以及对不特定数据类型的支持 ,传入和返回类型一致
    T表示泛型,具体什么类型是调用方法的时候决定的

    function getData<T>(value:T):T{
      return value;
    }
    getData<number>(123)
    
    class MinCla<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;
      }
    }
    var m1=new MinClas<number>(); //实例化类 并制定了类的T代表的类型是number;
    
    var m2=new MinClas<string>(); //实例化类 并制定了类的T代表的类型是number;
    
    • 泛型接口
    interface ConfigFn{
      <T>(value:T):T;
    }
    
    var getData:ConfigFn=function<T>(value:T):T{
      return value;
    }
    
    getData<string>('zhangsan');
    getData<string>(123); //错误
    

    • 装饰器

    装饰器是一个方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。
    常见的装饰器有:类装饰器、属性装饰器、方法装饰器、参数装饰器

    1. 类装饰器:在类声明前被声明(紧靠着类),可以用来监视修改或替换类。传入一个参数。
    function logClass(params:any){
      console.log(params) //params 就是当前类
      params.prototype.apiUrl='aaaa';
      params.prototype.run=function(){
        console.log('我是一个run方法')
      }
    }
    @logClass
    class HttpClient{
      constructor(){
        
      }
      getData(){
        
      }
    }  
    var http:any=new HttpClient();
    console.log(http.apiUrl) // aaaa
    http.run();
    

    1.2 类装饰器:装饰器工厂(可传参)

    function logClass(params:string){
      return function(target:any){
        console.log(target); // 当前类
        console.log(params); //hello
        target.prototype.apiUrl=params;
      }
    }
    @logClass('hello')
    class HttpClient{
      constructor(){
        
      }
      getData(){
        
      }
    }  
    var http:any=new HttpClient();
    console.log(http.apiUrl) // aaaa
    

    1.3. 类装饰器,重载构造函数的例子

    function logClass(target:any){
        console.log(target);
        return class extends target{
          apiUrl:any='我是修改后的值';
          getData(){
            apiUrl=this.apiUrl+'111'
          }
        }
    }
    @logClass('hello')
    class HttpClient{
      constructor(){
        
      }
      getData(){
        
      }
    }  
    var http:any=new HttpClient();
    console.log(http.apiUrl) // aaaa
    http.run();
    

    2.属性装饰器
    属性装饰器表达式会在运行时当作函数被调用,传入下列2个参数
    1.对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
    2.成员的名字

    function logClass(params:string){ //类装饰器
      return function(target:any){
        console.log(target); // 当前类
        console.log(params); //hello
      }
    }
    
    //属性装饰器
    function logProperty(params:any){
      return function(target:any,attr:any){
        console.log(target);
        console.log(attr);
        target.attr=params;
      }
    }
    @logClass('hello')
    class HttpClient{ 
      @logProperty('http:itying.com')
      public url:any | undefined;
      constructor(){
        
      }
      getData(){
        console.log(this.url);
      }
    }  
    var http:any=new HttpClient();
    console.log(http.apiUrl) // aaaa
    http.run();
    

    3.方法装饰器 - 会被应用到方法的属性描述符上,可以用来监视修改或者替换方法定义。

    方法装饰器会在运行时传入下列三个参数
    1.对于静态成员来说是类的构造函数,对于实例成员来说是类的原型对象。
    2.成员的名字
    3.成员的属性描述符。

    function get(params:any){
      return function(target:any,methodName:any,desc:any){
        console.log(target); // 当前类
         console.log(methodName) //getNData
         console.log(desc.value) //getData方法
        //修改装饰器的方法 把所有参数改成string类型
        //保存当前方法
        var oMethod=desc.value;
        desc.value=function(...args:any[]){
          args=args.map((value)=>{
            return String(value)
          })
          oMethod.apply(this,args); //如果没这句,会覆盖getData方法。
        }
      }
    }
    class HttpClient{
      public url:any | undefined
      constructor(){
        
      }
      @get('http://dddd')
      getData(...args:any[]){
        console.log(this.url)
      }
    }  
    
    • 装饰器 的执行顺序:
      属性 > 方法 > 方法参数 >类
      如果有多个,则从后向前执行

    相关文章

      网友评论

          本文标题:TypeScript语法

          本文链接:https://www.haomeiwen.com/subject/axcbfctx.html