快速上手TypeScript

作者: 爱写Bug的程序猿 | 来源:发表于2019-03-05 22:15 被阅读4次

    TypeScript

    准备

    为啥学TS

    ts是为了解决js在开发大型项目时的天生缺陷的js超集。他使js拥有像java、c#、c++的一下高级语言的功能,如强类型变量、继承、重载、类、接口、多态、抽象类等功能。

    安装

    npm i -g typescript
    

    编译(生成为同名的js文件)

    tsc <ts文件>
    

    配置自动编译

    第一步:生成ts配置文件tsc --init

    第二步:修改tsconfig.json的outdir参数(生成js文件的位置)

    第三步:点击任务 【任务】->【运行任务】->【tsc】->【监视tsconfig.json】

    类型

    • boolean 布尔型

      • var boo:boolean;
    • number 数字型

      • var num:number;
    • string 字符串型

      • var str:string;
    • array 数组类型

      • var arr:number[];
      • var arr:Array<string>;
    • tuple 元组类型

      • var tup:[string,number,string]=[‘12’,15,‘58’];
    • enum 枚举类

    • enum Flat{
          success=1,
          fail=0
      }
      
      var c:Flat = Flag.success;
      
    • any 任意类型

      • var an:any;
    • null 与 undefined

      • never的子集
      • var a:null;
      • var b:undefined;
    • void 类型

      • function fn():void{
            //表示没有返回值
        }
        
    • never 其他类型

      • 表示重来都不会出现的值
    • 同时使用定义多个类型

      • var num:number | undefined;
    • 强制类型转换

      • Number()
      • Boolean()
      • ….

    函数定义

    普通函数

    function run(name:string):string{
        console.log(name);
        return "ok";
    }
    
    var fn = function():string{
        return "ok";
    }
    

    可选参数

    function run(name?:string):string{
        console.log(name);
        return "ok";
    }
    

    注意:可选参数放到后边。

    默认参数

    function run(name:string='张三'):string{
        console.log(name);
        return "ok";
    }
    

    剩余参数

    function sum(...result:number[]):void{
        console.log(result);
    }
    

    函数重载

    java重载:重载指的是两个或者两个以上的同名函数,但他们参数不同,这是会出现函数重载的情况。

    ts重载:通过一个函数提供多个功能。

    function fn(name:string):string;
    
    function fn(age:number):number;
    
    function fn(str:any):any{
        if(typeof str == "string"){
            return str;
        }else{
            return str;
        }
    }
    

    ES5的类与ts的静态方法与继承

    ES5的类

    function Per(){
        this.name='李四';
        this.age=25;
    }
    /*
    注意:原型链上面的属性与方法会被多个实例共享,构造函数则每次new都会创建相同的独立的对象。
    */
    Per.prototype.sex = '男';
    Per.prototype.print = function(){/*实例方法*/
        console.log(
            this.name,
            this.age,
            this.sex
        )
    }
    Per.test = function(){
        /*静态方法*/
        alert('这是一个静态方法');
    }
    /*
        实例方法:表示必须new之后才可以使用
        静态方法:表示不需要实例也可以使用。
    */
    

    ES5继承

    function Fn(name){
        this.name=name;
    }
    Fn.prototype.getName = function(){
        console.log(this.name);
    }
    /------------------------------
    function Jc(){
        Fn.call(this);/*对象冒充继承,只能基础实例下的属性不能继承原型链上的属性*/
    }
    var a = new Jc();
    log(a.getName)//err not default function
    //------------------------------
    function Jc(){
        
    }
    Jc.prototype = new Web();/*原型链继承,可以完全继承,但是不能给继承的对象传参*/
    //------------------------------
    /*组合继承,通过冒充继承来继承构造函数的属性与发法,通过原型链继承被继承的原型链*/
    //------------------------------
    
    

    ts定义类

    class Fn{
        public name:string;//public可以省略
        //属性
        
        constructor(name:string){//构造函数 new的时候触发
            this.name = name;
        }
        
        getName():void{
            log(this.name);
        }
        //方法
    }
    

    ts继承

    class Fnc extends Fn{//继承上面的类
        constructor(name:string){
            super(name);//调用继承的构造函数
        }
    }
    /*
        定义属性的三个修饰符:
            public      公有,没有限制*
            protected   保护,外面不可以访问
            private     私有,只能本类访问
    */
    

    定义静态方法

    class Fn{
        constructor(){
        }
        
        static sex = '静态属性';
        
        static print(){
            /*静态方法*/
            log("静态方法");
        }
    }
    
    fn.print();//打印:静态方法
    

    多态

    定义:父类定义一个方法不去实现,让继承的子类去实现,每个子类有不同的表现。

    抽象类与抽象方法

    定义:

    • ts中的抽象类不能直接实例化,他只能做为其他类的父类。

    • 通过abstract来定义一个抽象类或抽象方法。

    • abstract抽象方法只能放在抽象类里。

    • 抽象类和抽象方法用来定义标准的,他的子类必须实现抽象方法。

    接口

    定义:只定义的传值、数量、类型、返回值,不进行实现,这就是接口的定义。

    属性接口

    //普通约束
    function fn(obj:{a:number}):void{
        //传值必须为对象,并且包含a数字
    }
    
    //批量约束
    interface Full{
        //定义约束对象
        a:string;
        b:number;
    }
    
    function(obj:Full){
        //必须传入只包含a与b的对象
    }
    

    可选属性接口

    interface Full{
        //定义约束对象
        a:string;
        b?:number;
    }
    
    function(obj:Full){
        //必须传入只包含a与b的对象,b可以不传,a必须传
    }
    

    类类型接口

    定义:对类进行限制,与抽象类很相似。

    interface Animal{
        name:string;
        eat(str:string):void;
    }
    
    class Dog implements Animal{
        //结构必须与定义的一样
        name:string;
        constructor(){
            this.name = "狗";
        }
        
        eat(){
            console.log(this.name+"吃肉");
        }
    }
    

    接口继承

    interface In{
        name:string;
        fn():void;
    }
    
    interface InExt extends In{
        age:number;
        fn1():void;
    }
    
    class Pre implements InExt{
        //必须实现inExt与In的规定
        name:string;
        age:number;
        constructor(){
            
        }
        
        fn():void{
            
        }
        
        fn1():void{
            
        }
    }
    

    泛型

    定义:通过一个字母来代替一个类型,可以配合接口,类一起用。

    function getData<T>(value:T):T{
        return value;
    }
    
    getData<string>('1234');
    

    相关文章

      网友评论

        本文标题:快速上手TypeScript

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