美文网首页
TypeScript简单了解

TypeScript简单了解

作者: 树树呐雪 | 来源:发表于2019-04-20 14:22 被阅读0次

    安装: npm install -g typescript
    文件后缀: xx.ts、xx.tsx、**.d.tx
    需要编译:tsc **.ts
    强类型语言:number、string、boolean、null、undefined、enum、symbol、any、void
    面向对象
    AMD规范

    类型
    1. 基本类型及其隐式声明
      声明变量时同时确定变量类型,类型一旦确定就不可以更改;
      如果设定了类型,但是赋值时赋的是另一种类型的话会报错:
      error TS2322: Type ' "abc" ' is not assignable to type 'number'.
      1.1 any
      变体变量,js里面原本的变量
    var a:any;
    a = 123;  
    a= 'abc';  
    // 隐式声明为 any类型
    var a;
    

    1.2 numberstringboolean

    var a:number;
    var b:string;
    var c:boolean;
    // 隐式声明
    var a = 1;  //  相当于 var a:number = 1;
    var b = 'a'; //  相当于 var b:string = 'a';
    var c = true;  // 相当于 var c:boolean = true;
    

    1.3 enum
    枚举,这个变量的值只能是限定范围内的值,如果不是范围内的值就会报错
    比如:月份只能由1~12月,但是如果你给变量赋了个值为13 的话,就会报错

    enum GENDER={
      MALE,
      FEMALE
    }
    

    1. . 联合类型
      变量可以且只可以是选定的类型之一,并且可以在选定的类型范围内随意变换类型。
      需要注意的是,如果某个表达式的结果被赋给了联合类型的变量,那么只要这个表达式的结果有不是规定类型可能,也会报错。(详看案例2)
    // 案例1
    var a:number | string;
    a = 12;
    a = 'abc';
    a = false; // error TS2322: Type ' false ' is not assignable to type 'number | string'.
    
    // 案例2 
    var a:number | string;
    var b:boolean;
    a = b ? 1 : false; 
    // error TS2322: Type ' false | 1' is not assignable to type 'number | string'. Type ' false ' is not assignable to type 'number | string'.
    // a的类型被定义为number或string,但是在三元表达式中a有可能被赋值为false,所以这里也报错了
    

    1. 数组类型及其隐式声明
      var arr:xxx[];
    var arr = [ 1, 2, 3 ]; // 相当于 var arr:number[] = [ 1, 2, 3 ]
    var arr = [ 1, false, 'a' ]; // 相当于 var arr:any[] = [ 1, false, 'a' ]
    

    1. 函数相关
      函数参数有类型检测
      函数参数有个数检测
      函数返回值有类型检测
    // 案例1
    function test( a:number, b:number ){
      console.log( a + b );
    }
    test( "1", 2 ); // error TS2345: Argument of type ' "1" ' is not assignable to parameter of type 'number'.
    
    // 案例2
    function test( a:number, b:number ){
      console.log( a + b );
    }
    test( 2, 3, 5); // error TS2346: Supplied parameters do not match signature of .. all target.
    test( 2 ); // error TS2346: Supplied parameters do not match signature of .. all target.
    
    // 案例3,函数作为参数,并且需要传参
    // 函数签名:fun1:(n:number)=>void
    function fun(fun1:(n:number)=>void){};
    // fun函数接收一个函数fun1作为参数,并且fun1函数本身需要传参n,参数n要求为number类型,而且没有返回值
    fun(
        function (n:string){}
    ) 
    // 报错,因为fun的参数的函数里的参数设定的是string和fun函数要求不一致
    
    // 参数可选
    function(n:number,s:string,b?:boolean){}
    // 函数接收参数n且n为number、s为string、b为boolean,但是b是可选的,可传可不传
    
    // 检测返回值类型
    function fun(a:number, b:number):number{
           return 'a';
    }
    // error TS2322:  Type ' a ' is not assignable to type 'number
    

    1. 对象类型
    var obj:{n:number,s:string,b?:boolean}
    // 定义了 obj对象,对象里面至少由两个属性:n、s,而且他们的类型分别是number和string,至于属性b,他是可选属性,可以有也可以没有。
    

    1. 冲突检测
      代码中有无用的选项(即打死都不会执行的代码),会报错。
    enum GENDER={
      MALE,
      FEMALE
    }
    var c = GENDER.MALE;  
    switch(c){
      case GENDER.MALE:
        bresk;
      case GENDER.FEMALE:
        bresk;
    }
    // error TS2678: Type 'GENDER.FEMALE' is not comparable to type 'GENDER.MALE'.
    // 因为这里设定了c的值,所以switch语句中,永远只会走第一个case,所以第二个case是没有用的。
    // 如果更改为:var c;  这样就不会报错
    

    1. 外部变量声明
      declare var 变量;
      在实际应用中可能会有引用外部插件的情况,比如我们引用了jquery,想要在ts文件中使用jquery,那么就需要使用$去调用jquery的方法;但是如果我们直接使用的话它会认为我们没有声明,从而报错。
      但是像window、document等等是内置外部声明,在ts语言中已经声明过了,可以直接引用。
    console.log(a); // error TS2304: Cannot find name 'a'.(变量未声明)
    
    declare var $; // 引用外部变量 ,不引用而直接用的话,会报错
    $.type("a");
    
    // 可以直接引用
    window.onload = function (){
      alert('a');
    };
    

    1. 接口(interface)
    interface login{
        name:string,
        tel:number,
        sys?:string
    }
    
    var log:login;
    
    log={
        name:"snow",
        tel:10086,
        sys:"iOS"
    }
    
    interface signIn{
        name:string,
        tel:number,
    }
    
    interface signUp{
        name:string,
        tel:number,
        date:string
    }
    
    var sign:signIn | signUp;
    console.log(sign.date); // error 2339
    

    class User{
        name:string;
        tel:number;
    
        constructor(name:string, tel:number){
            this.name = name;
            this.tel = tel;
        }
    
        signIn(){
            console.log("signIn-name:"+this.name+",tel:"+this.tel);
        }
    }
    
    var u = new User("snow",10086);
    u.signIn();
    

    1. 修饰符
      public
      private只能内部访问
      protected 只有子类可以访问
    class User{
        name:string;
        public tel:number;
        private pw:string;
        
        signIn(){
            console.log("signIn-name:"+this.pw); // 不报错,可在内部访问
        }
    }
    
    var u = new User();
    console.log(u.name); // 不报错,默认就是public
    console.log(u.tel); // 不报错
    console.log(u.pw); // [error 2341]
    

    1. 泛型
    class User<T>{
        name:T;
        tel:T;
        
        constructor(name:T,tel:T){
            this.name = name;
            this.tel = tel;
        }
    }
    
    var u = new User('snow',10086); // [error] 默认被设为string,所以第二个参数的类型不对
    var u1 = new User(123,10086); // 默认被设为number,不报错
    var u2 = new User<boolean>(true,false); // 设置了类型,设为了boolean
    

    相关文章

      网友评论

          本文标题:TypeScript简单了解

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